アップデート
@Tometzkyの主張によって引き起こされました:
使用するregexp_replace
ことは単にreplace
(...)
私は反対しなければなりません。正規表現関数は強力ですが、比較的低速です。
したがって、イベント 3xreplace()
は、単一のシンプルなイベントよりも高速ですregexp_replace()
- 少なくとも私のテストでは:
CREATE OR REPLACE FUNCTION quote_like2(text)
RETURNS text LANGUAGE SQL IMMUTABLE STRICT AS
$func$
SELECT replace(replace(replace(
$1
,'\', '\\') -- must come first
,'_', '\_')
,'%', '\%');
$func$;
ドル引用符ではなく、単純な一重引用符を使用していることに注意してください。これにはstandard_conforming_strings = on
、PostgreSQL 9.1 以降のデフォルトである が必要です。
データで両方の関数を試してください。
EXPLAIN ANALYZE SELECT quote_like1(col) from tbl;
元の答え
質問のタイトルに反して、通常はreplace()
または同様の文字列関数を使用してパターンを準備します。次のデモを検討してください。
SELECT 'abcde' LIKE ('abc_' || '%') -- TRUE
,'abc_e' LIKE ('abc_' || '%') -- TRUE
,'abcde' LIKE (replace('abc_', '_', '\_') || '%') -- FALSE
,'abc_e' LIKE (replace('abc_', '_', '\_') || '%'); -- TRUE