zoukankan      html  css  js  c++  java
  • Sql字符串分组Split函数的两种实现方法

    在给文章加自定义标签时,需要在存储过程中对输入的字符串按照“,”字符分割成一个字符数组。但是Sql中没有实现字符串分组的Split方法。因此就需要编写一个自定义的Split函数。我首先是使用表值函数的方法实现的字符串分组,但是在使用中感觉不是很方便。后来又在网上找到了一种使用两个标量函数,其中一个函数首先返回分割后字符数组的长度,另一个函数依次返回每个分割出的字符串。然后使用循环依次获取分割的字符。

    表值函数实现Split方法

     1 Create FUNCTION [dbo].[SplitToTable]
     2 (
     3     @SplitString nvarchar(max),
     4     @Separator nvarchar(10)=' '
     5 )
     6 RETURNS @SplitStringsTable TABLE
     7 (
     8 [id] int identity(1,1),
     9 [value] nvarchar(max)
    10 )
    11 AS
    12 BEGIN
    13     DECLARE @CurrentIndex int;
    14     DECLARE @NextIndex int;
    15     DECLARE @ReturnText nvarchar(max);
    16     SELECT @CurrentIndex=1;
    17     WHILE(@CurrentIndex<=len(@SplitString))
    18         BEGIN
    19             SELECT @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);
    20             IF(@NextIndex=0 OR @NextIndex IS NULL)
    21                 SELECT @NextIndex=len(@SplitString)+1;
    22                 SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);
    23                 INSERT INTO @SplitStringsTable([value]VALUES(@ReturnText);
    24                 SELECT @CurrentIndex=@NextIndex+1;
    25             END
    26     RETURN;
    27 END

    select * FROm dbo.SplitToTable('111,b2222,323232,32d,e,323232f,g3222', ',')

    结果为

    id          value
    ----------- ---------------------------------------
    1           111
    2           b2222
    3           323232
    4           32d
    5           e
    6           323232f
    7           g3222

    (7 行受影响)

    使用循环的方法

    首先GetSplitLength函数返回分割后的字符数组的长度。

     1 Create function [dbo].[GetSplitLength]
     2 (
     3  @String nvarchar(max),  --要分割的字符串
     4  @Split nvarchar(10)  --分隔符号
     5 )
     6 returns int
     7 as
     8 begin
     9  declare @location int
    10  declare @start int
    11  declare @length int
    12 
    13  set @String=ltrim(rtrim(@String))
    14  set @location=charindex(@split,@String)
    15  set @length=1
    16  while @location<>0
    17  begin
    18    set @start=@location+1
    19    set @location=charindex(@split,@String,@start)
    20    set @length=@length+1
    21  end
    22  return @length
    23 end

    select dbo.GetSplitLength('111,b2222,323232,32d,e,323232f,g3222',',')

    结果为7。

    GetSplitOfIndex函数是按顺序分别获取分割后的字符串。

     1 ALTER function [dbo].[GetSplitOfIndex]
     2 (
     3  @String nvarchar(max),  --要分割的字符串
     4  @split nvarchar(10),  --分隔符号
     5  @index int --取第几个元素
     6 )
     7 returns nvarchar(1024)
     8 as
     9 begin
    10  declare @location int
    11  declare @start int
    12  declare @next int
    13  declare @seed int
    14 
    15  set @String=ltrim(rtrim(@String))
    16  set @start=1
    17  set @next=1
    18  set @seed=len(@split)
    19  
    20  set @location=charindex(@split,@String)
    21  while @location<>0 and @index>@next
    22  begin
    23    set @start=@location+@seed
    24    set @location=charindex(@split,@String,@start)
    25    set @next=@next+1
    26  end
    27  if @location =0 select @location =len(@String)+1 
    29  
    30  return substring(@String,@start,@location-@start)
    31 end

     select dbo.GetSplitOfIndex('111,b2222,323232,32d,e,323232f,g3222',',', 3)

    结果323232。

     1 DECLARE @Tags nvarchar(max);
     2 SELECT @Tags='111,b2222,323232,32d,e,323232f,g3222';
     3 DECLARE @Tag nvarchar(1000)
     4 DECLARE @next int;
     5 set @next=1
     6 
     7 DECLARE @Length int;
     8 SELECT @Length=dbo.GetSplitLength(@Tags,',')
     9 
    10 while @next<=@Length
    11 begin
    12     SET @Tag = left(dbo.GetSplitOfIndex(@Tags,',',@next), 16);
    13     print @Tag
    14     SET @Next=@Next+1;
    15 END

    结果为:

    111
    b2222
    323232
    32d
    e
    323232f
    g3222

     

  • 相关阅读:
    HDU1213How Many Tables并查集
    Redis新的存储模式diskstore
    GPFS文件系统笔记
    redis持久化
    360安全卫士qurl.f.360.cn分析
    [原创]解决DataSet的GetXml()方法空列不返回问题
    在多台服务器上简单实现Redis的数据主从复制
    史航416随笔
    史航416实验1总结
    史航416第二次作业总结
  • 原文地址:https://www.cnblogs.com/hyl8218/p/1637991.html
Copyright © 2011-2022 走看看