ホームページ >データベース >mysql チュートリアル >DB2 SQL を使用してカンマ区切りの列を行に分割するにはどうすればよいですか?

DB2 SQL を使用してカンマ区切りの列を行に分割するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-20 08:40:09356ブラウズ

How to Break Down Comma-Separated Columns into Rows Using 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 句を使用して参照を反復的に分割します。列を個々の値に変換します:

  • lvl は再帰レベルを表します。最大 100 レベルの後に分割プロセスが終了するようにします。
  • CTE の最初の行は、Reference 列の最初のトークンを参照の初期値として選択し、文字列の残りの部分を末尾として選択します。
  • 後続の行は前の行の末尾を参照として使用し、末尾が空になるか最大再帰レベルが高くなるまで分割プロセスを繰り返します。
  • 最後に、CTE の外側の SELECT ステートメントは、アンピボット CTE から目的の ID、fk_ref、および参照列を抽出します。

注:

データの整合性が損なわれる可能性があるため、データをカンマ区切り形式で保存しないことが重要です。問題が発生し、データ操作とクエリがより複雑になります。ただし、提供されるソリューションは、避けられない場合や必要な場合に、そのようなデータをより管理しやすく使用可能な形式に変換する方法を提供します。

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

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