sql server 字符串分割并转行

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
字符串.png

此方法我觉应用得很巧妙,但性能没有去做测试。
我认为最佳性能 应该还是 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 ;

你可能感兴趣的:(sql server 字符串分割并转行)