2016-11-23 78 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