sql server 没有像 mysql SUBSTRING_INDEX 这么灵活的字符函数,所以字符串分割并转行 一般是通过自定义函数来实现
今天刷文章,刷到一篇 不需要自定义函数,来实现字符串分割并转行 以此做为记录
mysql 字符串分割并转行 传送门 https://www.jianshu.com/p/b40ac2dc3c25
思路是 将要转换为列转为xml 再解析xml
贴上代码
declare @tb table (sname varchar(10),svalue varchar(20))
insert into @tb
select '张三','1,2,3,43,5' union all
select '李四','143,132412,5,5,45,4'
SELECT sname,[value]
FROM (SELECT [sname],[svalue]=CAST(''+REPLACE(svalue,',',' ')+' ' AS xml) FROM @tb) a
OUTER APPLY (SELECT [value]=T.C.value('.','varchar(50)') FROM a.[svalue].nodes('/v') AS T(C)) b
此方法我觉应用得很巧妙,但性能没有去做测试。
我认为最佳性能 应该还是 outer apply + 自定义字符串分解函数 性能最好吧。
了解 outer apply 可以看这里 https://www.jianshu.com/p/05dc169b7dc1
引用的原贴
https://blog.csdn.net/wanglei_samrtfish/article/details/90645510
如果拼的字符串不多,也可以另一种形式,公用表达式解决。但如果字符串太多,就不能用公用表达式,因为公用表达式递归是有限制的
贴一段代码
declare @test table(id int,ids varchar(50));
insert into @test
select 1,'1,12,135' union all
select 2,'2,25,234';
with split(id,splid,idsstr) as
(
select id,cast('' as varchar(20)),ids+',' from @test
UNION ALL
SELECT id, cast(substring(idsstr, 0, charindex( ',',idsstr)) as varchar(20)),substring(idsstr, charindex( ',',idsstr)+1,len(idsstr))
FROM split WHERE idsstr!=''
)
select id,splid from split
where splid != ''
order by id ;