SQL Server:将含逗号分隔值的列拆分为多行的实现需求
拆分SQL Server中逗号分隔字段为多行记录
嘿,这个需求在SQL Server里太常见了!我给你几个不同版本适用的解决方案,你按需挑选就行:
方案1:SQL Server 2016及以上版本(推荐,最简单)
从SQL Server 2016开始,官方提供了STRING_SPLIT函数专门用来拆分分隔符字符串,搭配CROSS APPLY就能轻松实现你的需求:
SELECT t.productid, s.value AS subproductid FROM your_table t CROSS APPLY STRING_SPLIT(t.subproductid, ',') s;
CROSS APPLY会把拆分后的每一个子ID和原表对应的productid关联起来,直接输出你想要的多行结果,而且这个函数是官方优化过的,性能也靠谱。
方案2:SQL Server 2016以下版本(递归CTE实现)
如果你用的是更早的版本,没有STRING_SPLIT,可以用递归CTE来逐个拆分逗号分隔的内容:
WITH SplitCTE AS ( -- 初始化:把原字段赋值给current_val SELECT productid, CAST('' AS VARCHAR(MAX)) AS remaining, CAST(subproductid AS VARCHAR(MAX)) AS current_val FROM your_table UNION ALL -- 递归拆分:每次取第一个逗号前的内容,剩下的继续拆分 SELECT productid, CAST(SUBSTRING(current_val, CHARINDEX(',', current_val) + 1, LEN(current_val)) AS VARCHAR(MAX)), CAST(SUBSTRING(current_val, 1, CASE WHEN CHARINDEX(',', current_val) = 0 THEN LEN(current_val) ELSE CHARINDEX(',', current_val) - 1 END) AS VARCHAR(MAX)) FROM SplitCTE WHERE current_val <> '' ) -- 过滤空值,得到最终结果 SELECT productid, current_val AS subproductid FROM SplitCTE WHERE current_val <> '' ORDER BY productid;
方案3:SQL Server 2016以下版本(数字表拆分)
另一种低版本的实现方式是用数字表(生成连续的数字序列),通过定位逗号位置来截取子ID:
-- 先生成一个包含连续数字的临时表(这里生成1到1000的数字,足够应对大部分场景) DECLARE @Numbers TABLE (Number INT); INSERT INTO @Numbers (Number) SELECT TOP (1000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM sys.all_columns ac1 CROSS JOIN sys.all_columns ac2; -- 拆分字段 SELECT t.productid, SUBSTRING(',' + t.subproductid + ',', n.Number + 1, CHARINDEX(',', ',' + t.subproductid + ',', n.Number + 1) - n.Number - 1) AS subproductid FROM your_table t JOIN @Numbers n ON n.Number < LEN(',' + t.subproductid + ',') WHERE SUBSTRING(',' + t.subproductid + ',', n.Number, 1) = ',' ORDER BY t.productid;
给原字段前后加逗号是为了统一处理开头和结尾的子ID,避免边界情况出错。
内容的提问来源于stack exchange,提问作者Amresh Kumar Singh
相关产品推荐
相关产品推荐

