前段时间在工作中遇到一个问题:
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);