SQL Server T-SQL多属性字符串拼接结果合并为单行问题咨询
问题根因
你的查询返回两行,是因为GROUP BY子句包含了parent_prop_id,每个不同的属性ID会单独生成一行。CASE是行级判断逻辑,因此每行只会有一个字段返回拼接结果,另一个字段为空,才会出现你看到的两行错位的结果。
解决方法
方法1:兼容SQL Server 2016及更早版本(STUFF + FOR XML 写法)
直接把字符串拼接逻辑移到查询列中,仅按parent_id分组即可:
SELECT parent_id, String1 = STUFF(( SELECT '|' + element_value FROM ListOfString WHERE parent_id = LOS.parent_id AND parent_prop_id = '1DC045A5' ORDER BY element_value FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, ''), String2 = STUFF(( SELECT '|' + element_value FROM ListOfString WHERE parent_id = LOS.parent_id AND parent_prop_id = 'BEAE885B' ORDER BY element_value FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') FROM ListOfString LOS GROUP BY parent_id
注意:你原有写法中STUFF的第二个参数写了LEN(','),逻辑上是错误的,你拼接的分隔符是|,应该直接写1去掉第一个多余的分隔符即可。
方法2:SQL Server 2017+/Azure SQL 简化写法(STRING_AGG函数)
如果你的数据库支持STRING_AGG函数,写法会更简洁:
SELECT parent_id, String1 = STRING_AGG(CASE WHEN parent_prop_id = '1DC045A5' THEN element_value END, '|') WITHIN GROUP (ORDER BY element_value), String2 = STRING_AGG(CASE WHEN parent_prop_id = 'BEAE885B' THEN element_value END, '|') WITHIN GROUP (ORDER BY element_value) FROM ListOfString GROUP BY parent_id
方法3:基于你原有SQL的最小改动方案
如果不想大幅修改原有查询,可以在外层套一层聚合,用MAX函数取非空的拼接结果:
SELECT parent_id, MAX(String1) AS String1, MAX(String2) AS String2 FROM ( -- 此处直接放入你原有查询即可 SELECT LOS0.parent_id, String1 = CASE WHEN LOS0.parent_prop_id = '1DC045A5' THEN STUFF((SELECT '|' + LOS1.element_value FROM ListOfString LOS1 WHERE LOS0.parent_prop_id = LOS1.parent_prop_id ORDER BY LOS1.element_value FOR XML PATH('')), 1, 1, '') ELSE '' END, String2 = CASE WHEN LOS0.parent_prop_id = 'BEAE885B' THEN STUFF((SELECT '|' + LOS1.element_value FROM ListOfString LOS1 WHERE LOS0.parent_prop_id = LOS1.parent_prop_id ORDER BY LOS1.element_value FOR XML PATH('')), 1, 1, '') ELSE '' END FROM ListOfString LOS0 GROUP BY LOS0.parent_id, LOS0.parent_prop_id ) t GROUP BY parent_id
内容的提问来源于stack exchange,提问作者M Willingham
相关产品推荐
相关产品推荐

