sql >> データベース >  >> RDS >> PostgreSQL

正規表現またはLIKEパターンのエスケープ関数

    上部の質問に対処するには:

    正規表現エスケープ関数

    正規表現で特別な意味を持つ文字の完全なリストから始めましょう パターン:

    !$()*+.:<=>?[\]^{|}-
    

    角かっこ式にラップされると、それらのほとんどは特別な意味を失います-いくつかの例外を除いて:

    • - 最初または最後である必要があります。そうでない場合は、範囲を示します。 文字の。
    • ] および\ \でエスケープする必要があります (交換でも)

    以下の後方参照用にキャプチャ括弧を追加すると、次の正規表現パターンが得られます。

    ([!$()*+.:<=>?[\\\]^{|}-])
    

    この関数を使用すると、この関数はすべての特殊文字を円記号(\)でエスケープします。 )-それによって特別な意味を取り除きます:

    CREATE OR REPLACE FUNCTION f_regexp_escape(text)
      RETURNS text
      LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS
    $func$
    SELECT regexp_replace($1, '([!$()*+.:<=>?[\\\]^{|}-])', '\\\1', 'g')
    $func$;
    

    PARALLEL SAFEを追加します ( )Postgres 10以降で、それを使用するクエリの並列処理を可能にします。

    デモ

    SELECT f_regexp_escape('test(1) > Foo*');
    

    返品:

    test\(1\) \> Foo\*
    

    そしてその間:

    SELECT 'test(1) > Foo*' ~ 'test(1) > Foo*';
    

    FALSEを返します 、これはナイーブなユーザーにとっては驚きかもしれません

    SELECT 'test(1) > Foo*' ~ f_regexp_escape('test(1) > Foo*');
    

    TRUEを返します 今のように。

    LIKE エスケープ機能

    完全を期すために、 LIKEのペンダント 3文字だけが特別なパターン:

    \%_
    

    マニュアル:

    デフォルトのエスケープ文字は円記号ですが、ESCAPEを使用して別のエスケープ文字を選択できます 条項。

    この関数はデフォルトを想定しています:

    CREATE OR REPLACE FUNCTION f_like_escape(text)
      RETURNS text
      LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS
    $func$
    SELECT replace(replace(replace($1
             , '\', '\\')  -- must come 1st
             , '%', '\%')
             , '_', '\_');
    $func$;
    

    よりエレガントなregexp_replace()を使用できます ここでも、ただし、いくつかの文字については、replace()のカスケード 関数はより高速です。

    繰り返しますが、PARALLEL SAFE Postgres10以降で。

    デモ

    SELECT f_like_escape('20% \ 50% low_prices');
    

    返品:

    20\% \\ 50\% low\_prices
    


    1. OracleのNUMTOYMINTERVAL()関数

    2. 作成済みのテーブルへのOracleの自動インクリメント

    3. SQL Server DATEPART()とDATENAME()–違いは何ですか?

    4. MySQLを使用したSpringBootCRUDの例