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

  • 相关阅读:
    我的第一个java程序
    ==和equals的区别
    后缀数组题目总结
    后缀数组入门
    【POJ.3415 Common Substrings】后缀数组 长度不小于K的公共子串个数
    【UOJ #519 查查查乐乐】 DP
    【CF-1350 D. Orac and Medians】 思维
    【CF-1350 C
    【CF 1350 B.Orac and Models】 DP
    【POJ-2774】Long Long Message 后缀数组 最长公共子串(出现两次不重叠子串)
  • 原文地址:https://www.cnblogs.com/hejinyang/p/3075334.html
Copyright © 2020-2023  润新知