Oracle SQL:如何在表中筛选指定特殊字符(排除允许的波兰语字母等)
Oracle SQL筛选包含指定特殊字符的记录
问题分析
你需要筛选出包含!@#$%^&*_=[]{};<>这些特殊字符的记录,同时要排除波兰语字母ąśćół、符号-.,以及空白/换行符的误判。原SQL的问题在于正则字符集未包含波兰语字母,导致这些正常字母被当作特殊字符匹配,同时需注意指定特殊字符中的正则元字符(如[和])需要正确处理。
解决方案
方案1:直接匹配指定特殊字符
构造正则直接匹配目标特殊字符,对正则元字符[和]进行转义:
SELECT * FROM your_table WHERE REGEXP_LIKE(column_A, '[!@#$%^&*_=\[\]{};<>]') OR REGEXP_LIKE(column_B, '[!@#$%^&*_=\[\]{};<>]') OR REGEXP_LIKE(column_C, '[!@#$%^&*_=\[\]{};<>]') OR REGEXP_LIKE(column_D, '[!@#$%^&*_=\[\]{};<>]') OR REGEXP_LIKE(column_E, '[!@#$%^&*_=\[\]{};<>]');
方案2:排除允许字符,匹配剩余特殊字符
将所有允许的字符(含波兰语字母)加入正则的否定字符集,匹配所有不在允许列表中的字符(即你指定的特殊字符):
SELECT * FROM your_table WHERE REGEXP_LIKE(column_A, '[^0-9A-Za-ząśćół[:space:],.-]') OR REGEXP_LIKE(column_B, '[^0-9A-Za-ząśćół[:space:],.-]') OR REGEXP_LIKE(column_C, '[^0-9A-Za-ząśćół[:space:],.-]') OR REGEXP_LIKE(column_D, '[^0-9A-Za-ząśćół[:space:],.-]') OR REGEXP_LIKE(column_E, '[^0-9A-Za-ząśćół[:space:],.-]');
说明
- 方案1更精准,仅匹配你指定的特殊字符;方案2会筛选所有不在允许列表内的字符(若存在其他未指定特殊字符也会被包含)。
- 需确保数据库字符集为
AL32UTF8或支持Unicode的字符集,否则波兰语字母ąśćół可能无法被正确识别。 [:space:]已包含空格、换行符等空白字符,无需额外添加。
内容的提问来源于stack exchange,提问作者SQL_Python_DataScience
相关产品推荐
相关产品推荐

