ホームページ > データベース > mysql チュートリアル > Oracle でカンマ区切りの文字列を複数の行に分割するにはどうすればよいですか?

Oracle でカンマ区切りの文字列を複数の行に分割するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-22 17:51:12
オリジナル
506 人が閲覧しました

How to Split Comma-Separated Strings into Multiple Rows in Oracle?

Oracle でカンマ区切りの文字列を複数行に分割します

Oracle では、正規表現と階層クエリを組み合わせて使用​​して、カンマ区切りの文字列を複数行に分割できます。これを達成する方法に関する完全なガイドは次のとおりです:

問題ステートメント:

次の構造を持つテーブルがあるとします:

<code>名称 | 项目 | 错误
--------------
108  | test    | Err1, Err2, Err3
109  | test2   | Err1</code>
ログイン後にコピー

「error」列を複数の行に変換すると、結果は次のようになります:

<code>名称 | 项目 | 错误
--------------
108  | test    | Err1
108  | test    | Err2
108  | test    | Err3
109  | test2   | Err1</code>
ログイン後にコピー

解決策:

<code class="language-sql">with temp as (
    select 108 Name, 'test' Project, 'Err1, Err2, Err3' Error  from dual
    union all
    select 109, 'test2', 'Err1' from dual
)
select distinct
  t.name, t.project,
  trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))  as error
from 
  temp t,
  table(cast(multiset(select level from dual connect by  level <= regexp_count(t.error, ',')) as OdciNumberList)) levels
;</code>
ログイン後にコピー

手順:

  1. 一時テーブルの作成: サンプル データを保存するための TEMP テーブルを作成します。
  2. 階層クエリを使用します。 サブクエリ select level from dual connect by level <= regexp_count(t.error, ',') は、文字列内のカンマの数に 1 を加えたもの (つまり、エラーの数) に等しい一連の数値を生成します。
  3. キャストとテーブル: table() 関数と cast() 関数は、階層クエリを数値リストのコレクションに変換し、次にテーブルに変換します。これにより、TEMP テーブルの各行に対応する番号が増加する行が生成されます。
  4. エラー値の抽出: regexp_substr() 関数は、前のステップの数値に基づいて単一のエラー値を抽出するために使用されます。 trim() 関数は、先頭または末尾の空白を削除します。
  5. 結合と選択: メイン クエリは、TEMP テーブルと手順 4 で作成したテーブルを結合し、対応する列 (Name、Project、および Error) を選択します。

注: このソリューションは OdciNumberList タイプを使用しており、12c より前の Oracle バージョンを使用している場合は互換性設定を指定する必要がある場合があります。

以上がOracle でカンマ区切りの文字列を複数の行に分割するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート