1

我有以下正则表达式:

WHERE A.srvc_call_id = '40750564' AND REGEXP_LIKE (A.SRVC_CALL_DN, '[^TEST]')

包含 40750564 的行在列中有“TEST CALL”,SRVC_CALL_DN并且REGEXP_LIKE似乎没有将其过滤掉。每当我运行查询时,它不应该返回该行。

我的正则表达式模式错了吗?还是 SQL 不接受[^whatever]

4

2 回答 2

2

克拉将表达式锚定到字符串的开头。通过将字母 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'如果可以的话,请包括在内。

于 2012-04-04T18:46:35.780 回答
1

尝试使用'^TEST''^TEST.*'

您的正则表达式表示任何不以任何字符开头的字符串:T、E、S、T。

但是你的情况很简单,从 TEST 开始。为什么不使用简单的类似:

LIKE 'TEST%'
于 2012-04-04T18:26:55.560 回答