Oracle SQL中用正则匹配两表字段并筛选不匹配记录
Oracle SQL 筛选字段不匹配记录解决方案
根据需求,我们需要通过正则表达式提取两张表中字段的有效匹配部分,忽略无关前缀、分隔符和数字前导零,最终筛选出处理后内容不匹配的记录。以下是补充正则后的完整SQL及正则说明:
完整SQL代码
SELECT a.ID, a.EXAMPLE_STRING, b.EXAMPLE_STRING FROM Table1 a INNER JOIN Table2 b ON a.ID = b.ID WHERE REGEX_REPLACE( REGEX_REPLACE(a.EXAMPLE_STRING, '^.*?0888DY|[(),:]', ''), '([A-Z])0+([1-9]\d*)', '\1\2' ) != REGEX_REPLACE( REGEX_REPLACE(b.EXAMPLE_STRING, '^.*?0888DY|[(),:]', ''), '([A-Z])0+([1-9]\d*)', '\1\2' );
正则表达式说明
第一层
REGEX_REPLACE:清理无关内容^.*?0888DY:匹配从字符串开头到0888DY的所有内容(非贪婪匹配,确保只去掉前缀部分),替换为空[(),:]:匹配括号、逗号、冒号这些分隔符,替换为空
这一步完成后,会把示例中的(0888DY:A001:B2:C3)转换为A001B2C3,0888DY,A1:B2:C3转换为A1B2C3。
第二层
REGEX_REPLACE:去除数字前导零([A-Z])0+([1-9]\d*):匹配大写字母后跟随的一个或多个前导零,以及后续的非零数字(和可能的后续数字)\1\2:保留大写字母和去除前导零后的数字部分
这一步会把A001转换为A1,最终得到符合匹配规则的字符串。
执行上述SQL后,会筛选出像ID2这样处理后内容不匹配的记录,忽略ID1这类匹配的记录。
内容的提问来源于stack exchange,提问作者Teli
相关产品推荐
相关产品推荐

