首页 > 数据库 > mysql教程 > 如何在 Db2 中将逗号分隔值逆透视为多行?

如何在 Db2 中将逗号分隔值逆透视为多行?

Linda Hamilton
发布: 2024-12-25 15:21:10
原创
674 人浏览过

How to Unpivot Comma-Separated Values into Multiple Rows in Db2?

如何在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板