• SQL自定义函数split 将数组(分隔字符串)返回阵列(表)


    SQL自定义函数split

    CreateFunction Split(@StrsAsNvarchar(1024),@SeparatorasNvarchar(10),@IndexasInt)
    ReturnsNvarchar(1024) As
    begin
        
    Declare@iAsInt, @charposAsNvarchar(1024)
        
    Set@charpos=@Strs
        
    Set@i=1
        
    If@Index<0
               
    Begin
                 
    Set@charpos='超出下界'  
               
    End
        
    Else
          
    Begin 
          
    While@i<= (@Index-1)
               
    Begin
                
    IfCharIndex(@Separator, @charpos) >0
                 
    Begin
                    
    Set@charpos=Substring(@charpos, CharIndex(@Separator, @charpos) +1, Len(@charpos) -CharIndex(@Separator, @charpos))
                 
    End
          
    Else
          
    Begin
            
    Set@charpos='超出上界'
            
    Break
          
    End
         
    Set@i=@i+1
       
    End  

      
    If@charpos<>'超出上界'
           
    Begin
            
    IfCharIndex(@Separator, @charpos) >0 
                
    Begin
                      
    Set@charpos=Left(@charpos, CharIndex(@Separator, @charpos) -1)
                 
    End
           
    End
         
    End
        
    Return@charpos
    End
    --调用
    select dbo.Split('sdf|abc|csc|aldsfj|sfj|取出原素|asdf|adf|...','|',6)
    --返回 取出原素

    将数组(分隔字符串)返回阵列(表)

    --将数组(分隔字符串)返回阵列(表)
    --
    drop function fn_Split
    --
    自定义函数
    CREATE  FUNCTION fn_Split(@sTextnvarchar(4000), @sDelimvarchar(20) ='')
    RETURNS@retArrayTABLE (idx smallintPrimaryKey, value varchar(8000))
    AS
       
    BEGIN
           
    DECLARE@idxsmallint,
           
    @valuenvarchar(4000),
           
    @bcontinuebit,
           
    @iStrikesmallint,
           
    @iDelimlengthtinyint
           
    IF@sDelim='Space'
               
    BEGIN
                   
    SET@sDelim=''
               
    END
           
    SET@idx=0
           
    SET@sText=LTrim(RTrim(@sText))
           
    SET@iDelimlength=DATALENGTH(@sDelim)
           
    SET@bcontinue=1
           
    IFNOT ((@iDelimlength=0) or (@sDelim='Empty'))
               
    BEGIN
                   
    WHILE@bcontinue=1
                     
    BEGIN
                   
    --If you can find the delimiter in the text, retrieve the first element and
                    --insert it with its index into the return table.

                         
    IFCHARINDEX(@sDelim, @sText)>0
                            
    BEGIN
                                
    SET@value=SUBSTRING(@sText,1, CHARINDEX(@sDelim,@sText)-1)
                                   
    BEGIN
                                       
    INSERT@retArray (idx, value) VALUES (@idx, @value)
                                   
    END
                             
                           
    --Trim the element and its delimiter from the front of the string.
                              --Increment the index and loop.
                                SET@iStrike=DATALENGTH(@value) +@iDelimlength
                               
    SET@idx=@idx+1
                               
    if@idx=12
                                   
    begin
                                      
    set@bcontinue=0
                                   
    end
                               
    SET@sText=LTrim(right(@sText,(DATALENGTH(@sText) -@iStrike)/2))                                               
                            
    END                           
                         
    ELSE
                             
    BEGIN
                           
    --If you can't find the delimiter in the text, @sText is the last value in
                            --@retArray.
                                SET@value=@sText
                                   
    BEGIN
                                       
    INSERT@retArray (idx, value)
                                       
    VALUES (@idx, @value)
                                   
    END
                             
    --Exit the WHILE loop.
                                SET@bcontinue=0
                             
    END
                     
    END
               
    END
           
    ELSE
               
    BEGIN
                   
    WHILE@bcontinue=1
                       
    BEGIN
                     
    --If the delimiter is an empty string, check for remaining text
                      --instead of a delimiter. Insert the first character into the
                      --retArray table. Trim the character from the front of the string.
                    --Increment the index and loop.
                          IFDATALENGTH(@sText)>1
                             
    BEGIN
                               
    SET@value=SUBSTRING(@sText,1,1)
                                   
    BEGIN
                                       
    INSERT@retArray (idx, value) VALUES (@idx, @value)
                                   
    END
                                
    SET@idx=@idx+1
                                
    SET@sText=SUBSTRING(@sText,2,DATALENGTH(@sText)-1)     
                             
    END
                         
    ELSE
                             
    BEGIN
                             
    --One character remains.
                              --Insert the character, and exit the WHILE loop.
                                 INSERT@retArray (idx, value) VALUES (@idx, @sText)
                                
    SET@bcontinue=0
                             
    END
                       
    END
               
    END
         
    RETURN
       
    END
    --测试
    declare@nochar(100)
    set@no='china 中国,%…-- desefd,e 中国人fddc,mgns,a a'
    select*from fn_Split(@no,',')

    面的判断太多了不易于理解,下面转了一个简单的意思基本相同代码简单很多

    -- ============================================='
    --
    =============================================
    CREATE FUNCTION[dbo].[Fun_Split]
    (
    @SourceSqlvarchar(8000),
    @StrSepratevarchar(10)
    )
    RETURNS
    @TEMP_TableTABLE (a varchar(100))
    AS
    BEGIN
     
    DECLARE@iint
     
    SET@SourceSql=rtrim(ltrim(@SourceSql))
     
    SET@i=charindex(@StrSeprate,@SourceSql)
     
    WHILE@i>=1
       
    BEGIN
        
    INSERT@TEMP_TableVALUES(left(@SourceSql,@i-1))
        
    SET@SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
        
    SET@i=charindex(@StrSeprate,@SourceSql)
     
    END
    if@SourceSql<>'/'
      
    INSERT@TEMP_Tablevalues(@SourceSql)
    RETURN
    END

    作者:返回主页 linux运维-loring
    出处:http://www.cnblogs.com/zlf344242525/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    新手如何有效的刷算法题(LeetCode)
    五分钟,彻底明白一道今日头条算法面试真题
    LeetCode 图解 | 34.在排序数组中查找元素的第一个和最后一个位置
    图解:链式存储结构之循环链表(修订版)
    如何系统地学习数据结构与算法?
    不吹不黑!逛 GitHub 没看过这 10 个开源项目,绝对血亏...
    JAVA面向对象学习——java面向对象概念———一个简单的继承示例——super&this
    JAVA面向对象学习——java面向对象概念———重写
    JAVA面向对象学习——java面向对象概念———一个简单的继承示例——final关键字
    JAVA面向对象学习——java面向对象概念———一个简单的继承示例——调用父类构造器
  • 原文地址:https://www.cnblogs.com/zlf344242525/p/2617835.html
Copyright © 2020-2023  润新知