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

Oracleで文字列を分割する方法

    問題:

    Oracleで文字列を分割したい。

    例:

    文があり、それをスペース文字で分割したい。

    解決策:

    SELECT
    REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) AS parts
    FROM dual
    CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL;
    

    結果テーブルは次のようになります:

    パーツ
    An
    文。

    ディスカッション:

    文字列から部分文字列を取得するには、Oracleの組み込みのREGEXP_SUBSTR()関数を使用できます。 4つの引数が必要です:

    • 部分文字列を検索する文字列。
    • 正規表現;つまり、見つけたいパターンです。
    • パターンの検索を開始する位置(デフォルト値は1で、文字列の先頭から開始することを意味します)。
    • 一致する部分文字列の出現箇所を指定する番号(デフォルト値は1です 、つまり、最初に一致する部分文字列を表示する必要があります。

    この例では、検索される文字列は'An example sentence. '文字列内で、単語である部分文字列を探します。ここでは、スペースを除く任意の文字のグループとして定義します。これが、パターン'[^ ]+を指定する理由です。 '、つまり、スペース以外の文字の任意のシーケンス。 [^ ] スペースを除くすべての文字を表し、+ 記号は、そのような文字の1つ以上の出現を表します。 3番目の引数はデフォルト(1)である必要があります )、最初から文字列全体で単語を検索したいので。最後の引数は最もトリッキーです。検索する文字列ごとに値を変更する必要があります。レベルである必要があります– CONNECT BYを使用した階層クエリで使用可能な疑似列 –この場合、CONNECT BYを使用すると、結果の現在の行の行番号と等しくなります。つまり、次のようになります。

    REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level)

    この式は、dualから選択する必要があります –実際のテーブルから選択しない場合にOracleで使用される疑似テーブル。次に、CONNECT BYを実行する必要があります 取得した部分文字列がNULLであってはならないという条件で、階層クエリ演算子 。取得された部分文字列は、すべての単語が取得されるとNULLになります。その後、階層クエリは実行を停止します。つまり、次のようになります。

    FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL
    

    レベルとCONNECTBYについてはこちらをご覧ください。

    文字列を他の区切り文字で分割したい場合は、クエリを簡単に変更できます。たとえば、文字列をカンマで分割する場合は、'[^ ]を変更します。 +'から'[^,]+ '。クエリの例を次に示します。

    SELECT REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) AS parts
    FROM dual CONNECT BY REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) IS NOT NULL;
    

    1. SQL Server Management Studio(SSMS)を使用したデータベース設計の学習–パート2

    2. ver.2 PyGreSQLエラー:from _pg import * ImportError:DLLのロードに失敗しました:指定されたモジュールが見つかりませんでした

    3. 列を削除しても列参照が完全に削除されるわけではありません-postgresql

    4. Oracleエラー処理