如何在 Db2 中将逗号分隔的列转换为多行
许多应用程序需要将数据存储在关系表结构中,其中每条记录代表一个唯一的实体及其属性。然而,有时数据的结构可能不同,例如在单列中采用逗号分隔的格式。将此类数据转换为关系结构可能具有挑战性,但 Db2 提供了使用递归 SQL 的解决方案。
让我们考虑一个示例,其中表包含具有逗号分隔值的列:
Id | FK_ID | Reference ----------------------- 1 2100 GI2, GI32 2 2344 GI56
我们的目标是将这些数据转换为具有多行的表,其中每一行代表一个不同的参考:
Id | FK_ID | Reference ----------------------- 1 2100 GI2 2 2100 GI32 3 2344 GI56
下面的递归 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
此查询逆透视并迭代地将逗号分隔的值拆分为单独的行。结果是所需格式的关系表。注意:查询尚未经过测试,可能需要进行细微调整。
以上是如何在 Db2 中将逗号分隔值逆透视为多行?的详细内容。更多信息请关注PHP中文网其他相关文章!