SQL分割逗号的函数和用法

      在程序中我们可能经常会遇到这种情况,比如要取一个listbox里面的选择项,得到的结果可能是string ID="id1,id2,id3,id4",然后我们要把这些ID插入到数据库中,同时每个id对应的是要插入一条记录。实现的方法有很多,但是如果我们通过下面这个函数(RecurrentSplit)就能简单的达到上述效果。RecurrentSplit的使用也非常简单。

例如:

select row_number()over(order by indexno desc) as seq ,* from recurrentsplit('1,2,3,4,5,',',',0,0)

这样我们就会分成5条记录,因为我的要求是一个listbox中item[i]其中最小的说明他的排序在最前头,同时排序是但SEQ的降序排列。所以在这个查询中我用row_number()over(order by indexno desc) as seq得出了他的顺序号

如下

seq indexno   SplitName

1        4          5
2        3          4
3        2          3
4        1          2
5        0          1

然后就是对这个结果进行操作咯

 --设置选择商品为推荐并按传入的降序将商品推荐排序   
update zp_auction_mst
         set ishot=1,hotseq = b.seq
        from zp_auction_mst a,
         (select row_number()over(order by indexno desc) as seq ,* from recurrentsplit(@AuctionID,',',0,0)) as b
         where a.auctionid= b.splitName

 

 

搞定,就是这么简单了。。。。

 

CREATE FUNCTION [dbo].[RecurrentSplit]
(
@nvStr nvarchar(2000)  --需要分割字符串
,@vSeparte varchar(50)  --分割字符串
,@iIsHaveSeparte int   --是否显示字符串
,@iIsBefore int    --是否是后面的分割符(分割字符分割的顺序)
)
RETURNS @Split table
(
IndexNo int default(0)   --流水号
,SplitName nvarchar(1000)  --分割后字符串
)
AS
BEGIN
 if(charindex(@vSeparte,@nvStr)<=0) --处理在整个字符串里都没有要分割,也就是字符串本身
 begin
  insert into @Split(SplitName) values(@nvStr)
  return
 end
 declare @iSeparteLen int
 ,@iEndHave int --最后几个字符串是否是分割字符
 ,@iStartHave int --前面几个字符串是否是分割字符
 select @iSeparteLen=len(@vSeparte)
 ,@iStartHave=0
 ,@iEndHave=0
 ,@iIsHaveSeparte=case when @iIsHaveSeparte is null --默认值
  then 0
  else @iIsHaveSeparte
  end
 ,@iIsBefore=case when @iIsBefore is null --默认值
  then 0
  else @iIsBefore
  end
 if(@iIsBefore=1) --只有在处理前面字符串分割时才用
 begin
  if(left(@nvStr,@iSeparteLen)<>@vSeparte)--处理前面几个分割字符一定是分割字符,不是就加
  begin
   select @nvStr=@vSeparte+@nvStr
   ,@iStartHave=1
  end
 end
 if(right(@nvStr,@iSeparteLen)<>@vSeparte)--处理最后几个分割字符一定是分割字符,不是就加
 begin
  select @nvStr=@nvStr+@vSeparte
  ,@iEndHave=1
 end; --分号一定不能少,因为用了with,是用公用表达式,在其前面一定要加;
 
 with CharCET(CharStr,StrLen,IndexNo)
 as
 (
  select substring(@nvStr,0
  ,case when @iIsBefore=0 then charindex(@vSeparte,@nvStr)+@iSeparteLen
  else charindex(@vSeparte,@nvStr,charindex(@vSeparte,@nvStr)+@iSeparteLen) end
  ) CharStr
  ,case when @iIsBefore=0 then charindex(@vSeparte,@nvStr)
  else charindex(@vSeparte,@nvStr,charindex(@vSeparte,@nvStr)+@iSeparteLen) end StrLen
  ,0 IndexNo  --第一次初始化
  union all
  select substring(@nvStr
  ,case when @iIsBefore=0 then StrLen+@iSeparteLen
  else StrLen end
  ,charindex(@vSeparte,@nvStr,StrLen+@iSeparteLen)-StrLen) CharStr
  ,charindex(@vSeparte,@nvStr,StrLen+@iSeparteLen) StrLen
  ,IndexNo+1 IndexNo --进行递归分割字符串
  from CharCET
  where StrLen<len(@nvStr)-@iSeparteLen --处理递归结束语句,也就是不要让其生成无限弟归下去
 )
 insert into @Split(IndexNo,SplitName)
 select IndexNo,case when @iIsHaveSeparte=0
  then replace(CharStr,@vSeparte,'')
  else CharStr
  end CharStr
 from CharCET
 option(maxrecursion 0)
 
 if(@iIsHaveSeparte=1) --是否显示分割字符串
 begin
  update @Split --处理前面的分割字符串
  set SplitName=case when @iStartHave=1
   then replace(SplitName,@vSeparte,'')
   else SplitName
   end
  where IndexNo = 0

  update @Split --处理后面的分割字符串
  set SplitName=case when @iEndHave=1
   then replace(SplitName,@vSeparte,'')
   else SplitName
   end
  where IndexNo = (select Max(IndexNo) from @Split)
 end
 RETURN
END

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server分割函数是一种用于将字符串按照指定分隔符分割成多个子字符串的函数。这种函数通常用于处理包含多个值的字符串,例如将多个姓名通过逗号分隔的字符串分割成独立的姓名。 在SQL Server中,可以使用内置的字符串分割函数如STRING_SPLIT()或自定义的函数来实现字符串分割。STRING_SPLIT()函数SQL Server 2016及更高版本的内置函数,它接收两个参数,第一个参数是要分割的字符串,第二个参数是分隔符。函数返回一个表,其中包含原始字符串中的各个子字符串作为行的值。 例如,如果有一个包含多个姓名的字符串'John,Smith,Mary',可以使用以下代码将其分割成多个子字符串: ```sql SELECT value FROM STRING_SPLIT('John,Smith,Mary', ','); ``` 上述代码将返回一个结果集,包含三个行,分别是'John'、'Smith'和'Mary'。 如果使用较早版本的SQL Server,可以编写自定义的字符串分割函数。这种函数通常使用循环或递归的方式,将字符串逐个字符遍历,当遇到分隔符时,将之前累积的字符作为一个子字符串,将其添加到结果集中。具体实现方式可以根据需求和个人喜好来选择。 总而言之,SQL Server分割函数是一种方便的方法,可以将字符串按照指定的分隔符分割成多个子字符串。通过使用内置的STRING_SPLIT()函数或自定义的函数,可以轻松地实现字符串的分割操作,从而方便地进行后续的数据处理和分析。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值