2016-11-23 6 views
1

私は、Oracleでのフィルタのパフォーマンスは、あなたがそうリテラルLIKE検索の文字列をエスケープする関数はありますか?

WHERE col LIKE 'abc%' 

または

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

を書くかどうかに応じて非常に異なることができることに気づいた、私はいつも、クエリように使用したいと思います。しかし、私の接頭辞は任意のASCII文字を含むことができるので、%_、およびエスケープ文字自体をエスケープする必要があります。

  • 私はそのような何かのためにREGEXP_REPLACEを使用することができます。私もトリプルをREPLACEんでした

    WHERE col LIKE REGEXP_REPLACE(pat, '([%_\\])', '\\\1') || '%' ESCAPE '\' 
    
  • WHERE col LIKE REPLACE(REPLACE(REPLACE(pat,'\','\\'),'%','\%'),'_','\_') || '%' ESCAPE '\' 
    

どちらの方法は、男にとって苦痛です後でそれを読むだろう。 WHERE begins_with(col, pat) > 0、またはWHERE 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

あなたは 'どこでも好きですか?\\ B% 'エスケープ' \ ';'を意味しましたか? –

+0

@MatthewMcPeakはい、彼はそれをマークダウンインデント問題でした – Benoit

+0

私はすでにエスケープ文字を選択できることを知っています。私の問題は、自分のトリプルリプレースまたはregexpリプレースを展開せずに '%'と '_'の特別な意味を削除したい場合に、リテラル文字列を適切にエスケープする便利な機能があるかどうかを知ることです。 – Benoit

関連する問題