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

SQL实现逗号分隔行值拆分为多列的方法咨询

逗号分隔字符串拆分为多列的实现方案

针对临时表#TEST4中NAME列的逗号分隔字符串,以下提供两种可行的拆分方案,分别适配不同SQL Server版本:

方案一:使用STRING_SPLIT + PIVOT(SQL Server 2016及以上版本)

该方案利用SQL Server 2016引入的STRING_SPLIT函数拆分字符串,再通过PIVOT将行转列为多列:

SELECT 
    NAME,
    [1] AS Col1,
    [2] AS Col2,
    [3] AS Col3,
    [4] AS Col4,
    [5] AS Col5
FROM (
    SELECT 
        t.NAME,
        s.value AS SplitValue,
        -- 为每个拆分后的元素生成序号,用于后续转列
        ROW_NUMBER() OVER(PARTITION BY t.NAME ORDER BY (SELECT NULL)) AS Seq
    FROM #TEST4 t
    -- 交叉应用拆分函数,将单个字符串拆分为多行
    CROSS APPLY STRING_SPLIT(t.NAME, ',') s
) AS SourceTable
PIVOT (
    -- 聚合函数选择MAX,因为每个序号对应唯一值
    MAX(SplitValue)
    -- 指定要转列的序号值
    FOR Seq IN ([1], [2], [3], [4], [5])
) AS PivotTable;

方案二:使用XML方法(兼容SQL Server 2005及以上版本)

如果你的SQL Server版本低于2016,可以用XML解析的方式实现拆分:

SELECT 
    NAME,
    -- 通过XML节点索引提取对应位置的元素
    Col1 = XMLData.value('/root[1]/item[1]', 'VARCHAR(25)'),
    Col2 = XMLData.value('/root[1]/item[2]', 'VARCHAR(25)'),
    Col3 = XMLData.value('/root[1]/item[3]', 'VARCHAR(25)'),
    Col4 = XMLData.value('/root[1]/item[4]', 'VARCHAR(25)'),
    Col5 = XMLData.value('/root[1]/item[5]', 'VARCHAR(25)')
FROM (
    SELECT 
        NAME,
        -- 将逗号分隔字符串转换为XML格式
        CAST('<root><item>' + REPLACE(NAME, ',', '</item><item>') + '</item></root>' AS XML) AS XMLData
    FROM #TEST4
) AS Temp;

注意事项

  • 上述方案默认每个NAME列的字符串都是固定5个逗号分隔元素,如果元素数量不固定,需要使用动态SQL生成对应列数,避免硬编码序号。
  • 使用STRING_SPLIT时,ORDER BY (SELECT NULL)仅保证在当前测试环境下顺序稳定,若需严格保证拆分顺序与原字符串一致,建议使用支持顺序的拆分方法(如结合OFFSET/FETCH或自定义拆分函数)。

内容的提问来源于stack exchange,提问作者Manny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:06:18