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

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

DDD
DDDオリジナル
2025-01-22 19:11:09337ブラウズ

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

カンマ区切り値を Oracle の行に変換します

カンマは複数の値を単一の文字列として表す一般的な区切り文字ですが、Oracle でデータを操作する場合、これらの値を異なる行に区切る必要がある場合があります。これはさまざまな方法で実現できます。

正規表現を使用した再帰クエリ

1 つの方法は、正規表現を含む再帰クエリを使用して各値を抽出することです。

<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>

このクエリは、REGEXP_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>

このクエリは、INSTR 関数を使用してカンマの位置を検索し、次に SUBSTR 関数を使用して個々の値を抽出します。

再帰結合を使用した CTE

3 番目の方法では、再帰結合を伴う共通テーブル式 (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>

このクエリは UNION ALL 演算子を使用して、コンマ以外の部分文字列をすべて抽出する再帰的 CTE を作成します。

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

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