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

如何在SQL或SSIS中将逗号分隔值拆分至对应行?该需求是否可实现?

当然可以!不管是在SQL数据库里直接处理,还是用SSIS做ETL转换,都能轻松把逗号分隔的字段值拆成单独的行。我给你整理两种环境下的具体实现方法:

在SQL中拆分逗号分隔值到行

不同的SQL数据库有不同的原生函数或实现方式,这里给几个主流场景的方案:

1. SQL Server 2016及以上版本(最简单)

用官方自带的STRING_SPLIT函数,直接拆分字符串并返回行:
假设你有一张表Products,结构是ProductID INT, CategoryNames VARCHAR(100),其中CategoryNames是逗号分隔的字符串(比如'Electronics,Home,Office'),拆分语句如下:

SELECT 
    p.ProductID,
    s.Value AS CategoryName
FROM Products p
CROSS APPLY STRING_SPLIT(p.CategoryNames, ',') s

CROSS APPLY会把拆分后的每一行和原表行关联,完美得到一对一的结果。

2. SQL Server 2016以下版本(无STRING_SPLIT)

可以用递归CTE来实现拆分:

WITH SplitCTE AS (
    SELECT 
        ProductID,
        CAST('' AS VARCHAR(100)) AS Remaining,
        CAST(CategoryNames AS VARCHAR(100)) AS CurrentValue
    FROM Products
    UNION ALL
    SELECT 
        ProductID,
        CAST(SUBSTRING(CurrentValue, CHARINDEX(',', CurrentValue) + 1, LEN(CurrentValue)) AS VARCHAR(100)),
        CAST(SUBSTRING(CurrentValue, 1, CHARINDEX(',', CurrentValue) - 1) AS VARCHAR(100))
    FROM SplitCTE
    WHERE CHARINDEX(',', CurrentValue) > 0
    UNION ALL
    SELECT 
        ProductID,
        CAST('' AS VARCHAR(100)),
        CurrentValue
    FROM SplitCTE
    WHERE CHARINDEX(',', CurrentValue) = 0 AND CurrentValue <> ''
)
SELECT ProductID, CurrentValue AS CategoryName
FROM SplitCTE
WHERE CurrentValue <> ''
ORDER BY ProductID

这个CTE会递归拆分字符串,直到把所有逗号分隔的部分都拆成单独行。

3. MySQL环境

可以结合SUBSTRING_INDEX和生成的数字序列来拆分:

SELECT 
    p.ProductID,
    TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(p.CategoryNames, ',', n.n), ',', -1)) AS CategoryName
FROM Products p
CROSS JOIN (
    SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5
) n
WHERE n.n <= 1 + LENGTH(p.CategoryNames) - LENGTH(REPLACE(p.CategoryNames, ',', ''))
ORDER BY p.ProductID, n.n

这里的子查询n生成了足够多的数字(根据你最多的分隔数量调整),然后通过两次SUBSTRING_INDEX提取每个位置的值。

4. PostgreSQL环境

用string_to_array把字符串转成数组,再用unnest把数组拆成行:

SELECT 
    p.ProductID,
    unnest(string_to_array(p.CategoryNames, ',')) AS CategoryName
FROM Products p

两步操作就能搞定,PostgreSQL的数组函数非常方便。

在SSIS中拆分逗号分隔值到行

如果是在SSIS数据流里处理,最常用的是脚本组件来实现多行输出,步骤如下:

  1. 打开SSIS包,在数据流任务中添加数据源(比如OLE DB源),连接到你的数据表,选择包含逗号分隔字段的列。
  2. 拖放一个脚本组件到数据流中,选择「转换」类型,连接数据源的输出到脚本组件。
  3. 双击脚本组件,在「输入列」选项卡中勾选需要拆分的逗号分隔字段(比如CategoryNames)。
  4. 在「输入和输出」选项卡中,点击「输出0」,把「同步输入ID」设为None,然后添加一个输出列(比如CategoryName,类型和原字段一致)。
  5. 点击「编辑脚本」,在脚本编辑器中找到ProcessInputRow方法,编写拆分逻辑(以C#为例):
public override void ProcessInputRow(Input0Buffer Row)
{
    if (!Row.CategoryNames_IsNull && !string.IsNullOrEmpty(Row.CategoryNames))
    {
        string[] categories = Row.CategoryNames.Split(',');
        foreach (string cat in categories)
        {
            Output0Buffer.AddRow();
            Output0Buffer.ProductID = Row.ProductID;
            Output0Buffer.CategoryName = cat.Trim(); // 去掉可能的空格
        }
    }
}
  1. 保存脚本,关闭编辑器,然后把脚本组件的输出连接到目标(比如OLE DB目标),映射好字段即可。

另外,如果你更习惯用SQL处理,也可以在SSIS的数据源中直接用上面SQL部分的拆分语句,提前把数据拆成多行再进入数据流,这种方式在数据量较大时可能更高效。

要是你用的是其他数据库版本或者有特殊的业务场景,随时补充细节我再给你调整方案!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:17:32