正则表达式不匹配正确的字符串

时间:2018-05-16 07:19:03

标签: sql regex netezza

我正忙着为商家的特定名称建立一个查找表。我尝试使用以下正则表达式,但它返回的结果少于标准"喜欢" Netezza SQL中的函数。请参考以下内容:

SQL Like函数:其中trim(upper(a.MRCH_NME))喜欢'%CNA%' - 返回4622场比赛

Netezza SQL中的正则表达式函数:其中array_combine(regexp_extract_all(trim(upper(a.MRCH_NME)),'。* CNA \ s',' i&# 39;),' |')=' CNA' - 返回2226场比赛

我查看了两个结果集,发现以下字符串不匹配:

!C CNA INT ARR
*CNA PLATZ 0400
015764 CNA CRAD
C#CNA PARK 0

我使用了以下正则表达式: /.* CNA \ s' /

知道上述字符串为什么不作为匹配项返回?

谢谢。

2 个答案:

答案 0 :(得分:1)

您可能应该使用regexp_like

SELECT *
FROM yourTable
WHERE REGEXP_LIKE(MRCH_NME, 'CNA[ ]', 'i');

这在逻辑上与使用LIKE的以下查询相同:

SELECT *
FROM yourTable
WHERE MRCH_NME LIKE '%CNA ';

答案 1 :(得分:0)

在我看来,问题更多的是你的代码而不是正则表达式。查看:like '%CNA %'返回包含一个CNA子字符串的所有条目,后跟条目中任意位置的文字空格。 '.*CNA\s'正则表达式匹配除换行符之外的任何0+字符,后跟CNA和**任何空格字符*。

度Acc。到this reference\s匹配“空白字符。空格定义为[\t\n\f\r\p{Z}]

因此,您实际上应该使用

WHERE REGEXP_LIKE(MRCH_NME, 'CNA ', 'i')

或者,更好地使用单词边界检查:

WHERE REGEXP_LIKE(MRCH_NME, '\bCNA\b', 'i')

其中\b标记从单词到非单词和非单词到单词字符的转换,从而确保整个单词搜索并证明正则表达式的使用。

如果您不需要将商家名称作为整个单词进行匹配,请使用常规LIKE'%CNA %',它应该更有效。