首页 >数据库 >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