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

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

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-22 17:56:13640ブラウズ

How Can I Split a Comma-Delimited String into Multiple Rows in Oracle 10g and 11g?

Oracle 10g および 11g でカンマ区切りの文字列を行に効率的に分割する

Oracle では、カンマ区切りの文字列を個々の行に分割するためのいくつかの方法を提供しています。この改善されたアプローチでは、正規表現と CONNECT BY 句を利用して、より効率的なソリューションを実現します。

<code class="language-sql">WITH temp AS (
    SELECT 108 AS Name, 'test' AS Project, 'Err1, Err2, Err3' AS 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 <= LENGTH(REGEXP_REPLACE(t.error, '[^,]+')) + 1) AS OdciNumberList)) levels</code>

詳細な説明:

このクエリは階層クエリを使用して文字列の分割を実現します。 手順を詳しく見てみましょう:

  1. サンプル データ: WITH 句は、カンマ区切りのエラー文字列を含むサンプル テーブル (temp) を定義します。

  2. 区切り文字数: LENGTH(REGEXP_REPLACE(t.error, '[^,] ')) 1 は、カンマの数に 1 を加えた値を計算します (最後の要素を考慮して)。これにより、必要な行数が決まります。

  3. シーケンスの生成: SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= ... は、1 から要素数までの一連の数値を生成します。 CONNECT BY は、このシーケンスを作成するために重要です。

  4. コレクションの作成: MULTISET(...) は、生成されたシーケンスからコレクション (数値のセット) を作成します。 CAST(... AS OdciNumberList) は、これを Oracle コレクション型に変換します。

  5. テーブル変換: TABLE(...) はコレクションを結果セットに変換し、それを temp テーブルと結合できるようにします。

  6. 文字列抽出: REGEXP_SUBSTR(t.error, '[^,] ', 1, levels.column_value) は、カンマで区切られた各部分文字列を抽出します。 [^,] は、1 つ以上の非コンマ文字と一致する正規表現です。 levels.column_value は、抽出の出現番号を提供します。

  7. トリミングと重複排除: TRIM(...) は先頭/末尾のスペースを削除します。 SELECT DISTINCT は重複する行を削除し、各エラーが 1 回だけ表示されるようにします。

このアプローチは、ループを回避し、Oracle の組み込み関数を利用してパフォーマンスを最適化するため、効率的です。 正規表現は、さまざまな文字列長やカンマ区切りデータ内の潜在的な不規則性を処理するための堅牢な方法を提供します。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。