使用 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中文网其他相关文章!