我有以下正则表达式:
WHERE A.srvc_call_id = '40750564' AND REGEXP_LIKE (A.SRVC_CALL_DN, '[^TEST]')
包含40750564的行在SRVC_CALL_DN
列中有“TEST CALL”,而REGEXP_LIKE
似乎没有将其过滤掉。每当我运行查询时,它都会返回该行。
我的正则表达式模式错了吗?或者SQL不接受[^whatever]
?
答案 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%'