ホームページ >データベース >mysql チュートリアル >Oracle でカンマ区切りの値を行に区切るにはどうすればよいですか?
Oracle データベース内のカンマ区切りデータの変換
Oracle データベースは、データを 1 つの列内にカンマ区切りの値として格納することが多いため、効率的なデータの操作や取得が妨げられます。 この記事では、このカンマ区切りのデータを個々の行に効果的に変換し、データの分析と処理を向上させるいくつかの方法を紹介します。
方法 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>
CONNECT BY
句はカンマ区切りの値を反復処理し、REGEXP_SUBSTR
は各部分文字列を抽出します。
方法 2: CTE を使用した ANSI 準拠のアプローチ
移植性を高めるために、Common Table Expression (CTE) が ANSI 準拠の代替手段を提供します。
<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: 正規表現を使用しない再帰的アプローチ
3 番目のオプションは正規表現を回避し、文字列操作のみに依存します。
<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
を利用して値を抽出します。
これらの手法は、カンマ区切り値を Oracle データベース内の行に変換するための効率的で信頼性の高いソリューションを提供し、データ処理と分析の向上を促進します。
以上がOracle でカンマ区切りの値を行に区切るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。