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

  • 相关阅读:
    《人月神话》阅读笔记(三)
    记账软件开发进度(六)
    记账软件开发进度(五)
    记账软件开发进度(四)
    《人月神话》阅读笔记(二)
    记账软件开发进度(三)
    package bufio
    Go语言:net/http包的使用模式和源码解析
    package http
    Golang系列中常用包
  • 原文地址:https://www.cnblogs.com/yuhanzhong/p/2921867.html
Copyright © 2011-2022 走看看