2016-11-23 79 views
1

我注意到,在Oracle的過濾性能可以根據你是否寫任何函數轉義文字LIKE搜索字符串?

WHERE col LIKE 'abc%' 

WHERE SUBSTR(col,1,3) = 'abc' 

所以,我想總是喜歡查詢使用是非常不同的。但是我的前綴可以包含任何ASCII字符,因此我必須轉義%,_和轉義字符本身。

  • 我可以用一個REGEXP_REPLACE對於類似的事情:

    WHERE col LIKE REGEXP_REPLACE(pat, '([%_\\])', '\\\1') || '%' ESCAPE '\' 
    
  • 我也做一個三重REPLACE:

    WHERE col LIKE REPLACE(REPLACE(REPLACE(pat,'\','\\'),'%','\%'),'_','\_') || '%' ESCAPE '\' 
    

兩種方式都是痛苦的傢伙之後會讀取它。是否有替代功能,風格爲WHERE begins_with(col, pat) > 0WHERE col LIKE like_literal(pat) || '%'或者我必須自己寫嗎?

+1

'pat'似乎是從別的地方來了。在將其傳遞給查詢之前對其進行修改。 –

回答

1

您可以確定您自己的轉義字符。

WHERE col LIKE 'A\_B%' ESCAPE '\'; 

在該模式中,轉義字符位於下劃線(_)之前。這導致Oracle從字面上解釋下劃線,而不是作爲特殊模式匹配字符。

請仔細閱讀下面的鏈接 https://docs.oracle.com/cd/B12037_01/server.101/b10759/conditions016.htm

+0

你是不是指'WHERE COL LIKE'A \ _B%'ESCAPE'';'? –

+0

@MatthewMcPeak,是的他做的,這是一個降價縮進問題 – Benoit

+0

我已經知道可以選擇轉義字符。我的問題是要知道是否有一個方便的函數來正確地轉義字符串,如果我想在不展開自己的三重替換或正則表達式替換的情況下刪除'%'和'_'的任何特殊含義。 – Benoit