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('张三|李四|王五','|')

原文地址:https://www.cnblogs.com/hejinyang/p/3075334.html