SQL如何将逗号分隔的字符串进行分拆截取?

写这篇文章是由于最近遇到这么个需求:
已知某表的字段值,是无规律带逗号分隔的字符串,样式如下:
在这里插入图片描述
现在要按逗号拆分成四个字段,样式如下:
在这里插入图片描述
我百度了很久也没有现成 的函数,只能自己想办法了。
先分析下,用最简单最笨的办法,就是substring函数和charindex函数,substring函数就是截取字符串,charindex函数目的是获取字符串中,某个字符的位置。

也就是说,用charindex函数获取第1,2,3个逗号的位置,然后再去截取,同时要考虑好有的字段没有3个逗号,就会报错的情况。

我按照这个思路自定义了一个函数,废话不多少,我把主要代码贴上并分步解释下:

一、先获取字符串中逗号的数量:

先定义个变量叫@cfq(拆分前),作为入参,然后获取这个变量中的逗号数量。这里百度有的写的很复杂,实际上有个取巧的办法:

select @dhsl=(select len(@cfq)-len(replace(@cfq,',','')))

意思就是用总的字符长度 - 去掉逗号后的字符长度=逗号数量。
编程嘛,思路很重要。
再新增一个入参叫@type,int型,也就是代表想查第几个字符串。
加个判断:如果@type> 逗号数量+1,或者入参@cfq为空,那么直接返回空值,防止报错,代码如下:

if @type>@dhsl+1  or  isnull(@cfq,'')='' ---如果超过本身字符数就返回空值
  begin 
  select @cfhzfc =''    ---拆分后字符串
  end

二、定义一个长度变量@len后面截取要用到,同时在@cfq传入的值后面加个逗号,也是为了防止后面报错:

select @len =0,@cfq=@cfq+','

当逗号数量为0 时,也就是只有一段有效字符串,直接获取@cfq从第1个子字符到逗号前一个字符的值。

这话有点绕口,逗号数量为0 ,是指原来传入的字符串的逗号数量,后面我们又在 @cfq 最后加了个逗号,我说了是为了防止报错。看代码

if @dhsl=0
 begin 
 select @cfhzfc1 =SUBSTRING(@cfq,1,charindex(',',@cfq)-1)
 end 

charindex函数后面第三个参数,指的是从第几位开始检索,如果没有传就从头开始。那么我们看下当@dhsl=1时候的代码:

if  @dhsl=1
 begin 
   select @cfhzfc1 =SUBSTRING(@cfq,1,charindex(',',@cfq)-1)
   select @len =len(@cfhzfc1)+2
   select @cfhzfc2 =SUBSTRING(@cfq,@len,charindex(',',@cfq,@len)-@len)
 end

@len是获取越过第一个逗号之后的首个字符的位置,然后charindex(’,’,@cfq,@len)就是获取下一个逗号的位置。

三、按照同样的逻辑写出第三、第四个字符串的获取方式,也就是当原始入参中逗号数量为2和3时,获取数据代码如下:


if  @dhsl=2
begin
 select @cfhzfc1 =SUBSTRING(@cfq,1,charindex(',',@cfq)-1)
 select @len =len(@cfhzfc1)+2

 select @cfhzfc2 =SUBSTRING(@cfq,@len,charindex(',',@cfq,@len)-@len)
 select @len =@len+len(@cfhzfc2)+1

 select @cfhzfc3 =SUBSTRING(@cfq,@len,charindex(',',@cfq,@len)-@len)
end 

if  @dhsl=3
begin
select@cfhzfc1 =SUBSTRING(@cfq,1,charindex(',',@cfq)-1)
select @len =len(@cfhzfc1)+2

 select @cfhzfc2 =SUBSTRING(@cfq,@len,charindex(',',@cfq,@len)-@len)
 select @len =@len+len(@cfhzfc2)+1

 select @cfhzfc3 =SUBSTRING(@cfq,@len,charindex(',',@cfq,@len)-@len)
 select @len =@len+len(@cfhzfc3)+1

 select @cfhzfc4 =SUBSTRING(@cfq,@len,charindex(',',@cfq,@len)-@len)
end

四、最后根据入参@type的要求,我们输出想要的结果:

select @cfhzfc =
case @type when 1 then  @cfhzfc1
when 2 then  @cfhzfc2
when 3 then  @cfhzfc3
when 4 then  @cfhzfc4
end

五、我把这个函数命名为dhzfcf,调用方式如下:

select dbo.dhzfcf(crq,1) 字段1   
, dbo.dhzfcf(crq,2) 字段2   
,dbo.dhzfcf(crq,3) 字段3   
, dbo.dhzfcf(crq,4) 字段4    from #temp1

这样就得到了文章开头想要的结果
在这里插入图片描述
后来跟同事交流 的过程中,发现其实还有好几种方法可以做成这样的拆分,最简单的就是直接将逗号替换成"," ,然后用insert into去取,有兴趣同学可以自己研究下。

好了,今天的分享就到这里,没看懂的同学多看几遍,欢迎点赞、关注、收藏、转发。其他更多精彩分享,请查阅本号历史文章!

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HIT杂谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值