SQL返回以下正则表达式的结果

时间:2012-04-04 18:23:09

标签: sql regex oracle

我有以下正则表达式:

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

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

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

2 个答案:

答案 0 :(得分:2)

克拉将表达式锚定到字符串的开头。通过包含字母T,E,S&您正在搜索方括号中的T,barsju suggests表示任何这些字符,而不是字符串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'

答案 1 :(得分:1)

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

你的正则表达式是指任何不以任何字符开头的字符串:T,E,S,T。

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

LIKE 'TEST%'