首页 > 解决方案 > 在 SQL SERVER 的逗号分隔列中获取不同的值

问题描述

我正在使用 SQL SERVER 版本 15.0.18390.0

我有一个带有这样的列的数据框,其中有动物的逗号分隔值。如何更改数据框以从输入中输出以逗号分隔的独特动物列表?

输入:

column1
dog,cat,dog,dog
dog,dog,bird,cat
panda,bird,cat

预期输出:

column1
dog,cat
dog,bird,cat
panda,bird,cat

标签: sqlsql-server

解决方案


真正的解决方案:

修复您的设计。

这里真正的问题是,为什么首先要在数据库中存储分隔数据?那是您真正的问题,因此真正的解决方案是修复您的设计。规范化您的数据,不要存储分隔数据。它打破了(关系)数据的多个基本规则。移动到具有多对一/多关系的多个表。


话虽如此,但您可以使用STRING_SPLITand来做到这一点STRING_AGG。请注意,由于STRING_SPLIT不返回序数值,因此将值添加回字符串的顺序不太可能遵循原始序数位置。

我还假设您使用的是完全受支持的 SQL Server 版本,但没有相反的证据。如果没有,您将需要分别使用用户定义的拆分器函数和FOR XML PATH2 个函数的方法。


WITH DistinctValues AS(
    SELECT DISTINCT
           V.DenormalisedData,
           SS.[Value]
    FROM (VALUES('dog,cat,dog,dog'),
                ('dog,dog,bird,cat'),
                ('panda,bird,cat'))V(DenormalisedData)
         CROSS APPLY STRING_SPLIT(V.DenormalisedData,',') SS)
SELECT STRING_AGG(DV.[Value],',') AS RedenormalisedData
FROM DistinctValues DV
GROUP BY DenormalisedData;

推荐阅读