SQL字符串操作
按指定符号分割字符串,返回分割后的元素个数
create function GetLength(@str nvarchar(1000),@split nvarchar(50) ) returns int as begin declare @length int --定义一个全局变量 set @length=1; set @str = ltrim(rtrim(@str));--去掉字符串两边的空格 declare @location int; --定义变量存放 分隔符的位置 set @location = charindex(@split,@str); while (@location<>0) begin set @length = @length + 1; set @location = @location+1; set @str= substring(@str,@location,len(@str)-@location+1); set @location= charindex(@split,@str); end return @length end
print dbo.GetLength('zhangsan|lisi|wangwu','|') --返回结果为3,如果找不到分割符则返回1;
按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便
--按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便 alter function GetElementByIndex(@str nvarchar(1000),@split nvarchar(50),@index int) returns nvarchar(1000) as begin declare @tb table( [key] nvarchar(10), [value] nvarchar(1000)); declare @location int; declare @length int ; declare @result nvarchar(1000); set @str=ltrim(rtrim(@str)); set @length =1; set @location= charindex(@split,@str); while (@location<>0) begin declare @data nvarchar(50); set @data=substring(@str,1,@location-1); insert into @tb values(@length,@data); set @length = @length + 1; set @location = @location+1; set @str= substring(@str,@location,len(@str)-@location+1); set @location= charindex(@split,@str); end insert into @tb values(@length,@str); select @result= [value] from @tb where [key]=@index; return @result; end
print dbo.GetElementByIndex('zhangsan|lisi|wangwu','z',2) --返回 lisi
第二种方法来获得指定下标的元素
--要获得第几个数据,就要先获得那个数据的 起始位置 跟紧挨着的这个数据的分隔符位置来获得这个元素的长度, --用substring(字符串,起始位置,【下一个分割符的位置-起始位置】)即可获得该元素; create function Get_ElementByIndex ( @str nvarchar(1000), @split nvarchar(50), @index int ) returns nvarchar(1024) as begin declare @location int --分隔符位置 declare @start int --截取的起始位置 declare @i int --全局的循环变量 declare @splitLen int --分割符的长度 set @str=ltrim(rtrim(@str)) set @start=1 set @i=1 set @splitLen=len(@split) set @location= charindex(@split,@str); --获得分割符位置 while @location<>0 and @index>@i begin set @start = @location + @splitLen; --@start为分割符后的第一个字符串所在位置 set @location= CHARINDEX(@split,@str,@start); --获取下一个分隔符的位置 set @i=@i+1; --每循环一次变量加 1 end --如果@location=0,有两种情况,一个是没有找到分割符,或者是最后一个元素,我们给该字符串最后面加一个默认的分隔符 if @location=0 begin select @location= len(@str)+1; end return substring(@str,@start,@location-@start); end
注:charindex(@split,@str);//第一个参数是分割符,第二个参数是字符串,写反了,找了半天错误!
根据分隔符遍历字符串,返回数组表
create function ArrSplit(@str nvarchar(2000),@split nvarchar(100) ) returns @tb table([data] nvarchar(100)) as begin set @str = @str+@split; while(@str<>'') begin declare @element nvarchar(100); set @element = left(@str,charindex(@split,@str)-1);----从左边以第一个开始截取,第二个参数是截取的长度 insert into @tb values(@element); set @str = stuff(@str,1,charindex(@split,@str),'');--删除第一个数组元素 end return end
select *from dbo.ArrSplit('张三|李四|王五','|')