Oracle SQL需求:提取列中非标准字符以规范插入模板允许值
提取列中非标准字符的解决方案
1. 定位包含非标准字符的记录
你原SQL的逻辑是筛选符合标准规则的记录,要找反例(含非标准字符的记录),需要用NOT REGEXP_LIKE,同时注意补全正则的引号(语法要求):
SELECT column_1 FROM mytable WHERE NOT REGEXP_LIKE(column_1, '^[a-zA-Z0-9-]+$')
这条语句会返回所有包含标准字符(a-z、A-Z、0-9、连字符)以外内容的记录。
2. 提取所有出现过的非标准字符
如果要单独列出所有存在的非标准字符(比如$%()*这类),可以用以下方式实现(以Oracle为例,不同数据库语法略有调整):
WITH chars AS ( SELECT DISTINCT SUBSTR(column_1, LEVEL, 1) AS non_std_char FROM mytable WHERE NOT REGEXP_LIKE(column_1, '^[a-zA-Z0-9-]+$') CONNECT BY LEVEL <= LENGTH(column_1) AND PRIOR column_1 = column_1 AND PRIOR SYS_GUID() IS NOT NULL ) SELECT non_std_char FROM chars WHERE NOT REGEXP_LIKE(non_std_char, '[a-zA-Z0-9-]') ORDER BY non_std_char;
逻辑说明:
- 递归CTE
chars会把所有含非标准字符的字段拆成单个字符 - 最后过滤掉标准字符,剩下的就是所有出现过的非标准字符
其他数据库适配示例
- PostgreSQL:用字符串拆分函数更简洁
SELECT DISTINCT unnest(regexp_split_to_array(column_1, '')) AS non_std_char FROM mytable WHERE column_1 !~ '^[a-zA-Z0-9-]+$' AND unnest(regexp_split_to_array(column_1, '')) !~ '[a-zA-Z0-9-]' ORDER BY non_std_char;
- MySQL:用数字辅助表实现拆分逻辑,替换
REGEXP_LIKE为REGEXP
内容的提问来源于stack exchange,提问作者M4AGIC
相关产品推荐
相关产品推荐

