ホームページ >データベース >mysql チュートリアル >Oracle でカンマ区切り値を行に変換するにはどうすればよいですか?

Oracle でカンマ区切り値を行に変換するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-22 18:52:11698ブラウズ

How to Convert Comma-Separated Values to Rows in Oracle?

Oracle データベース内のカンマ区切りデータの変換

多くのデータ操作タスクでは、分析を容易にするために、単一列内のカンマ区切り値 (CSV) を個別の行に変換する必要があります。 オラクルは、これを実現するためにいくつかのアプローチを提供しています。

方法 1: 正規表現を使用した再帰 SQL

この手法では、正規表現と組み合わせた再帰 SQL クエリを使用して、CSV を効率的に分割します。

<code class="language-sql">select distinct id, trim(regexp_substr(value,'[^,]+', 1, level) ) value, level
  from tbl1
   connect by regexp_substr(value, '[^,]+', 1, level) is not null
   order by id, level;</code>

このクエリは、カンマ区切りの各値を繰り返し抽出し、それぞれに新しい行を生成し、レベル インジケーターを含みます。

方法 2: 正規表現を使用しない再帰 SQL (CTE)

より標準的な SQL アプローチでは、Common Table Expression (CTE) を利用します。

<code class="language-sql">with t (id,res,val,lev) as (
           select id, trim(regexp_substr(value,'[^,]+', 1, 1 )) res, value as val, 1 as lev
             from tbl1
            where regexp_substr(value, '[^,]+', 1, 1) is not null
            union all           
            select id, trim(regexp_substr(val,'[^,]+', 1, lev+1) ) res, val, lev+1 as lev
              from t
              where regexp_substr(val, '[^,]+', 1, lev+1) is not null
              )
select id, res,lev
  from t
order by id, lev;</code>

この再帰 CTE は前の方法と同じ結果を達成しますが、正規表現への依存を回避します。

方法 3: 非再帰的アプローチ (INSTR および SUBSTR)

非再帰的な代替案では、INSTR() 関数と SUBSTR() 関数を使用して値を検索して抽出します。

<code class="language-sql">WITH t ( id, value, start_pos, end_pos ) AS
  ( SELECT id, value, 1, INSTR( value, ',' ) FROM tbl1
  UNION ALL
  SELECT id,
    value,
    end_pos                    + 1,
    INSTR( value, ',', end_pos + 1 )
  FROM t
  WHERE end_pos > 0
  )
SELECT id,
  SUBSTR( value, start_pos, DECODE( end_pos, 0, LENGTH( value ) + 1, end_pos ) - start_pos ) AS value
FROM t
ORDER BY id,
  start_pos;</code>

このメソッドは、カンマの位置を繰り返し見つけて部分文字列を抽出し、問題に対して別のアプローチを提供します。

最適な方法は、特定のデータとパフォーマンスのニーズによって異なります。 各アプローチをテストして、Oracle 環境にとって最も効率的なソリューションを決定することを検討してください。

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

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