使用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 子句來迭代拆分引用列分解為各個值:
注意:
避免以逗號分隔的格式儲存資料非常重要,因為這可能會導致資料完整性問題並使資料操作和查詢變得更複雜。但是,所提供的解決方案提供了一種在不可避免或必要的情況下將此類資料轉換為更易於管理和使用的格式的方法。
以上是如何使用 DB2 SQL 將逗號分隔的列分解為行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!