【分享一个SQL函数】在SQL脚本中匹配使用特定分隔符分隔字符串的位置

     前段时间在工作中遇到一个问题:

     abc,12,345,78

     这个字符串统一通过逗号隔开,现在需要通过知道 12这个字符串的位置。

     这种情况可以通过下面这个方法

    

/**
   说明: 1)返回第一个满足的字串的位置
         2)位置从0开始  
*/
IF EXISTS(SELECT * FROM DBO.SYSOBJECTS WHERE ID=OBJECT_ID(N'[dbo].[func_IndexOfSubstrInDelimiterStr]') and xtype in (N'FN', N'IF', N'TF')) 
  DROP FUNCTION [dbo].func_IndexOfSubstrInDelimiterStr
GO

CREATE  function  DBO.func_IndexOfSubstrInDelimiterStr
(
@str varchar(1024), --要分割的字符串
@split varchar(10), --分隔符号
@target varchar(100) --目标元素
)
returns INT
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int
declare @foundIndex int
declare @foundflag bit

select @foundIndex = -1; 
set @str=ltrim(rtrim(@str))
set @start=1
set @seed=len(@split)
select @foundflag = 0

set @location=charindex(@split,@str)
while @location > 0
begin
   --有找到分隔符号,后面还有内容
   SELECT @foundIndex = @foundIndex + 1
   if substring(@str, @start, @location - @start) = @target
   begin
     select @foundflag = 1
     break 
   end
   set @start=@location+@seed
   set @location=charindex(@split,@str,@start)
end
--没有分隔符的情况
if @location = 0 and @foundIndex = - 1
begin
  if @str = @target
    SELECT @foundIndex = @foundIndex + 1, @foundflag = 1   
end
else
if @location = 0 and @foundIndex >= 0
begin
  if substring(@str, @start, len(@str) - @start + 1) = @target
  begin
    select @foundIndex = @foundIndex + 1,@foundflag = 1  
  end   
end  
if @foundflag = 0
  select @foundIndex = -1
return @foundIndex 
end
GO

使用样例:

SELECT DBO.func_IndexOfSubstrInDelimiterStr('13,2,12,3,16,1', ',', '1')

返回的结果是 5


如果涉及对执行的字符串进行更新替换,那么可以直接使用SQL 提供的STUFF函数

需要注意的是STUFF中第二个参数的下标是从1开始的, @newStr = STUFF(SrcStr, StartPos, length, strForReplace);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值