【发布时间】:2024-05-20 10:30:02
【问题描述】:
以下查询返回如下所示的结果:
SELECT
ProjectID, newID.value
FROM
[dbo].[Data] WITH(NOLOCK)
CROSS APPLY
STRING_SPLIT([bID],';') AS newID
WHERE
newID.value IN ('O95833', 'Q96NY7-2')
结果:
ProjectID value
---------------------
2 Q96NY7-2
2 O95833
2 O95833
2 Q96NY7-2
2 O95833
2 Q96NY7-2
4 Q96NY7-2
4 Q96NY7-2
使用新添加的STRING_AGG 函数(在 SQL Server 2017 中),如以下查询所示,我能够得到下面的结果集。
SELECT
ProjectID,
STRING_AGG( newID.value, ',') WITHIN GROUP (ORDER BY newID.value) AS
NewField
FROM
[dbo].[Data] WITH(NOLOCK)
CROSS APPLY
STRING_SPLIT([bID],';') AS newID
WHERE
newID.value IN ('O95833', 'Q96NY7-2')
GROUP BY
ProjectID
ORDER BY
ProjectID
结果:
ProjectID NewField
-------------------------------------------------------------
2 O95833,O95833,O95833,Q96NY7-2,Q96NY7-2,Q96NY7-2
4 Q96NY7-2,Q96NY7-2
我希望我的最终输出只有如下独特的元素:
ProjectID NewField
-------------------------------
2 O95833, Q96NY7-2
4 Q96NY7-2
关于如何获得此结果的任何建议?如果需要,请随时从头开始完善/重新设计我的查询。
【问题讨论】:
-
所以您将数据存储为分隔值,现在您想要拆分它们,找到不同的值,最后将它们全部塞回分隔字符串?呸!!!分隔数据违反 1NF。这就是为什么你在这里如此挣扎的原因。首次拆分后,您必须使用带有 DISTINCT 的 STUFF 和 FOR XML 来执行此操作。
-
SQL 小提琴:sqlfiddle.com/#!18/0b959/1
-
关于如何在我的数据集中使用带有 DISTINCT 的 STUFF 和 FOR XML 的任何简单示例?我无法避免 STRING_SPLIT,因为不幸的是,原始数据存储为您意识到的分隔值。
-
小心那个 NOLOCK 提示。 blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere
标签: sql sql-server sql-server-2017 string-aggregation