在 DB2 中反转逗号分隔的数据
在数据库设计中,将多个引用存储在以逗号分隔的单个列中是不明智的。这种做法可能会导致效率低下和数据不一致。但是,可能会出现这样的情况:您继承了具有此类数据结构的数据库,因此有必要将其转换为规范化形式。
要在 DB2 中取消转置逗号分隔的数据,您可以利用递归 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
此查询将以逗号分隔的内容逆透视为单独的行。它使用递归来迭代尾部(剩余未处理的引用)并生成新行,只要有逗号且级别(递归深度)小于 100。
注意:此查询尚未经过测试,可能需要调整才能在您的特定环境中工作。
以上是如何使用递归 SQL 在 DB2 中逆透视逗号分隔的数据?的详细内容。更多信息请关注PHP中文网其他相关文章!