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