ホームページ >データベース >mysql チュートリアル >DB2 SQL を使用してカンマ区切りの列を行に分割するにはどうすればよいですか?
DB2 を使用してカンマ区切りの列を行に分割する
データベース管理の領域では、カンマ区切りの値を処理すると、多くの場合問題が発生する可能性があります。特に、個々の値を別々の行に抽出する場合には、これが課題となります。このようなシナリオの 1 つは、テーブルにカンマ区切りの参照を持つ列が含まれており、これらの参照を個々の行に分割する必要がある場合に発生します。
問題ステートメント
次の構造を持つテーブル:
Id | FK_ID | Reference ----------------------- 1 | 2100 | GI2, GI32 2 | 2344 | GI56
目標は、このデータを次の目的のデータに変換することです。出力:
Id | FK_ID | Reference ----------------------- 1 | 2100 | GI2 2 | 2100 | GI32 3 | 2344 | GI56
DB2 ソリューション
このデータ変換を実現するために、DB2 は、コンマ区切りの値を個々の行に繰り返し分割する再帰 SQL ステートメントを提供します。このソリューションでは、次の SQL コードを利用します。
WITH unpivot (lvl, id, fk_ref, reference, tail) AS ( SELECT 1, id, fk_ref, CASE WHEN LOCATE(',',reference) > 0 THEN TRIM(LEFT(reference, LOCATE(',',reference)-1)) ELSE TRIM(reference) END, CASE WHEN LOCATE(',',reference) > 0 THEN SUBSTR(reference, LOCATE(',',reference)+1) ELSE '' END FROM yourtable UNION ALL SELECT lvl + 1, id, fk_ref, CASE WHEN LOCATE(',', tail) > 0 THEN TRIM(LEFT(tail, LOCATE(',', tail)-1)) ELSE TRIM(tail) END, CASE WHEN LOCATE(',', tail) > 0 THEN SUBSTR(tail, LOCATE(',', tail)+1) ELSE '' END FROM unpivot WHERE lvl < 100 AND tail != '') SELECT id, fk_ref, reference FROM unpivot
説明
unpivot という名前のこの再帰 CTE (共通テーブル式) は、UNION ALL 句を使用して参照を反復的に分割します。列を個々の値に変換します:
注:
データの整合性が損なわれる可能性があるため、データをカンマ区切り形式で保存しないことが重要です。問題が発生し、データ操作とクエリがより複雑になります。ただし、提供されるソリューションは、避けられない場合や必要な場合に、そのようなデータをより管理しやすく使用可能な形式に変換する方法を提供します。
以上がDB2 SQL を使用してカンマ区切りの列を行に分割するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。