求助:Netezza SQL中regexp_like负向预查无法排除DEBTORS
我来帮你排查这个Netezza正则的问题!你的表达式失效主要有两个核心原因——Netezza使用的是POSIX扩展正则语法,和你习惯的Perl/PCRE正则有不少差异,咱们一步步拆解:
1. 单词边界\b在Netezza里不生效
在POSIX正则标准中,\b代表的是退格字符,而不是你想要的单词边界!正确的单词起始边界是[[:<:]],单词结束边界是[[:>:]]。你原来的\bMAKRO其实是在匹配"退格符+MAKRO",这完全偏离了你的需求。
2. 负向预查(?!DEBTORS)不被Netezza支持
Netezza的正则引擎不支持零宽断言(包括正向/负向预查),所以(?!DEBTORS)这个语法会被引擎忽略,自然无法排除包含DEBTORS的内容。
修正后的解决方案
既然预查用不了,咱们换一种更符合Netezza特性的写法:把匹配和排除逻辑拆分开,用AND NOT组合条件,清晰又可靠:
SELECT * FROM your_table a WHERE -- 匹配包含独立单词MAKRO的记录 regexp_like(trim(upper(a.MRCH_NME)), '[[:<:]]MAKRO[[:>:]]') -- 排除MAKRO后面紧跟DEBTORS的情况(支持0或多个空格) AND NOT regexp_like(trim(upper(a.MRCH_NME)), '[[:<:]]MAKRO\s*DEBTORS[[:>:]]');
额外优化点
你已经用了upper()把字段转成大写,所以可以去掉regexp_like的'i'修饰符,减少不必要的大小写检查,提升一点性能。
如果需要更灵活的匹配(比如MAKRO和DEBTORS之间有其他字符?),可以调整第二个正则的规则,但上面的写法应该能覆盖你原本的需求——匹配MAKRO,同时排除MAKRO后面直接跟DEBTORS的情况。
内容的提问来源于stack exchange,提问作者Atlas_Apple
相关产品推荐
相关产品推荐

