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

来源:互联网 发布:淘宝首页放淘客链接 编辑:程序博客网 时间:2024/04/29 04:32

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

     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_IndexOfSubstrInDelimiterStrGOCREATE  function  DBO.func_IndexOfSubstrInDelimiterStr(@str varchar(1024), --要分割的字符串@split varchar(10), --分隔符号@target varchar(100) --目标元素)returns INTasbegindeclare @location intdeclare @start intdeclare @next intdeclare @seed intdeclare @foundIndex intdeclare @foundflag bitselect @foundIndex = -1; set @str=ltrim(rtrim(@str))set @start=1set @seed=len(@split)select @foundflag = 0set @location=charindex(@split,@str)while @location > 0begin   --有找到分隔符号,后面还有内容   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 = - 1begin  if @str = @target    SELECT @foundIndex = @foundIndex + 1, @foundflag = 1   endelseif @location = 0 and @foundIndex >= 0begin  if substring(@str, @start, len(@str) - @start + 1) = @target  begin    select @foundIndex = @foundIndex + 1,@foundflag = 1    end   end  if @foundflag = 0  select @foundIndex = -1return @foundIndex endGO

使用样例:

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

返回的结果是 5


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

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


0 0
原创粉丝点击