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

OracleのREGEXP_REPLACE()関数

    Oracleでは、REGEXP_REPLACE() 関数は、指定された正規表現パターンに一致する文字列内の部分文字列の出現を置き換えます。

    REPLACE()の機能を拡張します 正規表現パターンを使用できるようにすることで機能します。

    構文

    構文は次のようになります:

    REGEXP_REPLACE ( source_char, pattern
                     [, replace_string
                        [, position
                           [, occurrence
                              [, match_param ]
                           ]
                        ]
                     ]
                   )

    場所:

    • source_char 検索値として機能する文字式です。
    • pattern は正規表現です。
    • replace_string 置換文字列です。
    • position 検索を開始する場所を指定する正の整数です。デフォルトは1です 、つまり、最初の文字から検索を開始します。
    • occurrence 置換するオカレンスを指定する非負の整数です。デフォルトは0です 、これはすべてのオカレンスを置き換えることを意味します。
    • match_param 関数のデフォルトの一致動作を変更できます。たとえば、大文字と小文字の区別、複数の行とスペースの処理方法などを指定できます。この引数は、REGEXP_COUNT()で使用した場合と同じように機能します。 働き。詳細については、Oracleのドキュメントを参照してください。

    REGEXP_REPLACE()を使用する基本的な例を次に示します。 Oracleの場合:

    SELECT 
        REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird')
    FROM DUAL;

    結果:

    Cats and birds

    この場合、一致があり、部分文字列は置換文字列に置き換えられます。

    正規表現は非常に強力である可能性があり、この例では非常に単純な例を使用しています。 REGEXP_REPLACE()を使用するには 事実上、望ましい結果を得るために使用する正しいパターンを知る必要があります。

    一致なし

    一致するものがない例を次に示します。

    SELECT REGEXP_REPLACE('Cats and dogs', 't.g', 'bird');

    結果:

    +------------------------------------------------+
    | REGEXP_REPLACE('Cats and dogs', 't.g', 'bird') |
    +------------------------------------------------+
    | Cats and dogs                                  |
    +------------------------------------------------+

    一致するものがないため、元の文字列は変更されずに返されます。

    複数の一致

    複数の一致がある例を次に示します。

    SELECT 
        REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird')
    FROM DUAL;

    結果:

    My bird likes other birds

    ただし、必要に応じて、置き換えるオカレンスを指定できます。

    SELECT 
    REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 1, 2)
    FROM DUAL;

    結果:

    My dog likes other birds

    ここに2つの引数を追加したことに注意してください– 1 および21 検索を開始する文字列の所在を指定します(この場合、最初の文字)。 2 置き換えるオカレンスを指定するものです。この場合、2番目のオカレンスが置き換えられます。

    最初に検索を開始した後に検索を開始すると、次のようになります。

    SELECT 
    REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 2)
    FROM DUAL;

    結果:

    My dog likes other dogs

    この場合、開始位置の後にオカレンスが1つしかないため、文字列は更新されません。

    最後の引数を1に変更した場合 、次に指定どおりに更新されます(指定された開始位置の後の最初のオカレンスであるため):

    SELECT 
    REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 1)
    FROM DUAL;

    結果:

    My dog likes other birds

    気になる方のために、0 すべてのオカレンスを指定します:

    SELECT REGEXP_REPLACE(
        'My dog likes big dogs and small dogs', 
        'd.g', 
        'bird', 1, 0
        )
    FROM DUAL;

    結果:

    My bird likes big birds and small birds

    ただし、指定された開始位置は引き続き尊重されます:

    SELECT REGEXP_REPLACE(
        'My dog likes big dogs and small dogs', 
        'd.g', 
        'bird', 7, 0
        )
    FROM DUAL;

    結果:

    My dog likes big birds and small birds

    大文字と小文字の区別

    REGEXP_REPLACE() 関数は、文字列をパターンと照合するときに使用する照合を定義するOracleの照合決定および導出規則に従います。

    ただし、オプションの6番目の引数を使用して、大文字と小文字の区別を明示的に指定できます。これを行うと、決定された照合の大文字と小文字の区別またはアクセントの区別が上書きされます。

    iを指定できます 大文字と小文字を区別しないマッチングとc 大文字と小文字を区別するマッチング用。

    次に例を示します:

    SELECT 
        REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0) AS "Default",
        REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0, 'i') AS "Case Insensitive",
        REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0, 'c') AS "Case Sensitive"
    FROM DUAL;

    結果:

       Default    Case Insensitive    Case Sensitive 
    __________ ___________________ _________________ 
    My Cats    My dogs             My Cats         

    これらの結果から、私のデフォルトの照合では大文字と小文字が区別されるようです。他の2つの文字列は、それぞれ大文字と小文字を区別しない一致と大文字と小文字を区別する一致を強制されました。

    ヌル引数

    nullを渡す 結果はnull 2番目と6番目の引数を除くほとんどの引数:

    SET NULL 'null';
    SELECT 
        REGEXP_REPLACE(null, 'c.t', 'dog', 1, 0, 'i') AS "1",
        REGEXP_REPLACE('Cat', null, 'dog', 1, 0, 'i') AS "2",
        REGEXP_REPLACE('Cat', 'c.t', null, 1, 0, 'i') AS "3",
        REGEXP_REPLACE('Cat', 'c.t', 'dog', null, 0, 'i') AS "4",
        REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, null, 'i') AS "5",
        REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, null) AS "6"
    FROM DUAL;

    結果:

          1      2       3       4       5      6 
    _______ ______ _______ _______ _______ ______ 
    null    Cat    null    null    null    Cat   

    デフォルトでは、SQLclおよびSQL * Plusは、nullの場合は常に空白を返します。 SQL SELECTの結果として発生します 声明。

    ただし、SET NULLは使用できます 返される別の文字列を指定します。ここでは、文字列nullを指定しました 返却する必要があります。

    引数の数が間違っています

    関数に引数を渡さないか、少なすぎると、エラーが発生します:

    SELECT REGEXP_REPLACE()
    FROM DUAL;

    結果:

    Error starting at line : 1 in command -
    SELECT REGEXP_REPLACE()
    FROM DUAL
    Error at Command Line : 1 Column : 8
    Error report -
    SQL Error: ORA-00938: not enough arguments for function
    00938. 00000 -  "not enough arguments for function"
    *Cause:    
    *Action:

    あまりにも多くの引数を渡す場合も同じです:

    SELECT REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, 'i', 'oops')
    FROM DUAL;

    結果:

    Error starting at line : 1 in command -
    SELECT REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, 'i', 'oops')
    FROM DUAL
    Error at Command Line : 1 Column : 8
    Error report -
    SQL Error: ORA-00939: too many arguments for function
    00939. 00000 -  "too many arguments for function"
    *Cause:    
    *Action:

    詳細情報

    REGEXP_REPLACE() 関数(およびOracleの他の正規表現の実装)は、IEEE Portable Operating System Interface(POSIX)正規表現標準およびUnicodeコンソーシアムのUnicode正規表現ガイドラインに準拠しています。

    REGEXP_REPLACE()の詳細と例については、Oracleのドキュメントを参照してください。 機能。


    1. サブクエリにないSQLselectは結果を返しません

    2. SQLSELECTで特定の値を持つレコードを除外する方法

    3. データベースをアップグレードするときに楽しむ5つの利点

    4. Cos()がPostgreSQLでどのように機能するか