2012-04-04 42 views
1

我有以下的正則表達式:SQL返回結果爲以下的正則表達式

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

包含40750564該行有列「測試呼叫」 SRVC_CALL_DNREGEXP_LIKE似乎並沒有被篩選出來。每當我運行查詢時,它都會返回不應該的行。

我的正則表達式模式錯了嗎?或者SQL不接受[^whatever]

回答

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'

+0

啊。這聽起來正確..我以爲他使用^作爲行的開始。 – barsju 2012-04-04 18:51:55

+0

我的意圖是排除任何與SRVC_CALL_DN「測試」行。我用你的建議與非REGEXP_LIKE,哪個工作!謝謝 ! – Kyle 2012-04-05 12:18:17

1

試着用'^TEST''^TEST.*'

你的正則表達式是指任何字符串沒有開始任何字符:T,E,S,T。

但是你的情況非常簡單,從TEST開始。爲什麼不用一個簡單的像:

LIKE 'TEST%' 
+0

+1我是如此專注於我不認爲像的正則表達式! – Ben 2012-04-04 18:57:10

相關問題