我有以下正则表达式:
WHERE A.srvc_call_id = '40750564' AND REGEXP_LIKE (A.SRVC_CALL_DN, '[^TEST]')
包含 40750564 的行在列中有“TEST CALL”,SRVC_CALL_DN
并且REGEXP_LIKE
似乎没有将其过滤掉。每当我运行查询时,它不应该返回该行。
我的正则表达式模式错了吗?还是 SQL 不接受[^whatever]
?
克拉将表达式锚定到字符串的开头。通过将字母 T、E、S 和 T 括在您正在搜索的方括号中,正如barju 建议的任何这些字符,而不是字符串 TEST。
你说SRVC_CALL_DN
包含字符串'TEST CALL'
,但你没有说在字符串中的位置。您还说您正在寻找此字符串不匹配的位置。这意味着您要使用not regexp_like(...
把所有这些放在一起,我认为你需要:
AND NOT REGEXP_LIKE (A.SRVC_CALL_DN, '^TEST[[:space:]]CALL')
这会从您的查询中排除字符串以 .开头 的每个匹配项'TEST CALL'
。但是,如果此字符串可能位于列中的任何位置,则需要删除克拉 - ^
。
这也假设字符串总是大写。如果它是混合大小写或更低,那么您需要再次更改它。类似于以下内容:
AND NOT REGEXP_LIKE (upper(A.SRVC_CALL_DN), '^TEST[[:space:]]CALL')
通过大写SRV_CALL_DN
,您可以确保始终匹配,但确保您的查询可能不会使用此列上的索引。我不会担心这一点,因为正则表达式查询在使用索引方面可能相当糟糕,而且看起来好像SRVC_CALL_ID
被索引了。
此外,如果它可能不包括'CALL'
您将不得不删除它。最好使用正则表达式使匹配模式尽可能明确;'CALL'
如果可以的话,请包括在内。
尝试使用'^TEST'
或'^TEST.*'
您的正则表达式表示任何不以任何字符开头的字符串:T、E、S、T。
但是你的情况很简单,从 TEST 开始。为什么不使用简单的类似:
LIKE 'TEST%'