zoukankan      html  css  js  c++  java
  • Sql实现Split

    create function [dbo].[Get_StrArrayLength]
    (
     @str varchar(max),  --要分割的字符串
     @split varchar(10)  --分隔符号
    )
    returns int
    as
    begin
     declare @location int
     declare @start int
     declare @length int
     --去掉前后空格
     set @str=ltrim(rtrim(@str))
     --分隔符第一次出现的位置
     set @location=charindex(@split,@str)
     --设置分隔后的字符串长度为1
     set @length=1

     while @location<>0
     begin
       set @start=@location+1
       set @location=charindex(@split,@str,@start)
       set @length=@length+1
     end
     return @length
    end

     drop function [dbo].[Get_StrArrayStrOfIndex]
    go
    create function [dbo].[Get_StrArrayStrOfIndex]
    (
     @str varchar(max),  --要分割的字符串
     @split varchar(10),  --分隔符号
     @index int --取第几个元素
    )
    returns varchar(1024)
    as
    begin
     declare @location int
     declare @start int
     declare @next int
     declare @seed int
     declare @pos int
     if @index<=0
     return ''
     set @str=ltrim(rtrim(@str))
     set @start=1
     set @next=1
     set @pos=1
     set @seed=len(@split)
     set @location=charindex(@split,@str)
     while @location<>0 and @index>@next and @pos<@index
     begin
       set @start=@location+@seed
       set @location=charindex(@split,@str,@start)
       set @next=@next+1
       set @pos=@pos+1
     end
     if @location =0
     if @pos<>@index
      return ''
     else
      select @location =len(@str)+1
    --这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。
     return substring(@str,@start,@location-@start)
    end

    declare @id varchar(30)
    select @id=dbo.Get_StrArrayStrOfIndex('4321,2223,333,5554',',',2)

    我的改进版本,可像Hashtable一样访问

    drop function [dbo].[Get_ArrayStrOfName]
    Go

    create function [dbo].[Get_ArrayStrOfName]
    (
        @str varchar(5000),  --要分割的字符串
        @split varchar(1),  --分隔符号
        @itemSplit varchar(1), --元素分割符
        @item varchar(20)   --取哪个元素
    )
    returns varchar(1024)
    As
    Begin
        declare @location int            --找到子串的位置
        declare @tempItem varchar(50)        --当前项
        declare @tempItemName varchar(20)    --当前项的名称
        set @str=ltrim(rtrim(@str))
        set @tempItem=''
        set @tempItemName=''
    while len(@str)>0
    Begin
        -----找到一个子项--
        set @location=charindex(@split,@str,1)
        if @location>0
            Begin
                    set @tempItem=substring(@str,1,@location-1)
                    set @str=substring(@str,@location+1,len(@str))
            End
        Else
            Begin
                set @tempItem=@str
                set @str=''
            end    
        ----------判断当前子项的名称--------------
        set @location=charindex(@itemSplit,@tempItem,1)
        if @location>0
            Begin
                set @tempItemName=substring(@tempItem,1,@location-1)
                if  @tempItemName=@item
                    return substring(@tempItem,@location+1,len(@tempItem))
            End
    End
        return ''
    End
    Go

    declare @id varchar(30)
    select @id=dbo.Get_ArrayStrOfName('ff@4321,ffg@2223,ggg@333,ddd@5554', ',', '@', 'ff')
    print @id

  • 相关阅读:
    [GSEAPY] 在Python里进行基因集富集分析
    scRNAseq R包公共单细胞数据获取
    pybedtools:在Python中使用BEDTools
    pybedtools 提取序列
    将博客搬至CSDN
    【转】SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    sql长日期数据以短日期格式显示【转】
    [转]YouTube架构学习体会
    [转]让Nginx 支持 ASP ASP.NET配置方法
    [转]LINQ查询总结
  • 原文地址:https://www.cnblogs.com/luluping/p/1530636.html
Copyright © 2011-2022 走看看