ホームページ >データベース >mysql チュートリアル >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 サイトの他の関連記事を参照してください。