問題:
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;