You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 06:03:02