首頁 >資料庫 >mysql教程 >如何使用 DB2 SQL 將逗號分隔的列分解為行?

如何使用 DB2 SQL 將逗號分隔的列分解為行?

Patricia Arquette
Patricia Arquette原創
2024-12-20 08:40:09360瀏覽

How to Break Down Comma-Separated Columns into Rows Using DB2 SQL?

使用DB2 將逗號分隔的列分解為行

在資料庫管理領域,處理逗號分隔的值通常會造成挑戰,尤其是在將單一值提取到單獨的行中時。當表包含帶有逗號分隔引用的列時,就會發生這種情況,並且需要將這些引用拆分為單獨的行。

問題陳述

考慮具有以下結構的表:

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代表遞歸level,確保分裂過程最多在 100 個等級後終止。
  • CTE 的第一行選擇Reference 列中的第一個token 作為參考的初始值,字串的其餘部分為
  • 後續行以前一行的尾部為參考,重複拆分過程,直到尾部為空或最大遞歸等級為
  • 最後,CTE 外部的SELECT 語句從unpivot CTE 中提取所需的id、fk_ref 和引用列。

注意:

避免以逗號分隔的格式儲存資料非常重要,因為這可能會導致資料完整性問題並使資料操作和查詢變得更複雜。但是,所提供的解決方案提供了一種在不可避免或必要的情況下將此類資料轉換為更易於管理和使用的格式的方法。

以上是如何使用 DB2 SQL 將逗號分隔的列分解為行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn