• SQL根据字符串B分隔字符串A


    创建表值函数:

     1 CREATE FUNCTION [dbo].[F_Split]
     2  (
     3      @SplitString nvarchar(max),  --源字符串A
     4      @Separator nvarchar(10)=' '  --分隔字符串B,默认为空格
     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;--开始截取字符串A的位置
    14      DECLARE @FindIndex int;--查询到字符串B的位置
    15      DECLARE @ReturnText nvarchar(max);--分割后的字符
    16 
    17      --保存被截取字符串B的长度
    18      DECLARE @SeparatorLen int; set @SeparatorLen=len(@Separator);
    19 
    20      SELECT @CurrentIndex=1;
    21      WHILE(@CurrentIndex<=len(@SplitString))--遍历字符串A
    22          BEGIN
    23              --charindex(目标字符串,被查找的字符串,开始查找的位置(为空时默认从第一位开始查找))
    24              SELECT @FindIndex=charindex(@Separator,@SplitString,@CurrentIndex);--获取B在A中的位置
    25             
    26              --如果B不存在A中,下一次查询到字符串的位置为:A的长度+B的长度
    27              IF(@FindIndex=0 OR @FindIndex IS NULL) Begin SELECT @FindIndex=len(@SplitString)+@SeparatorLen;End 
    28              --获取分隔后的字符
    29             
    30              --substring(被截取的字符串,开始截取字符串的位置,截取字符串的长度)
    31              SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@FindIndex-@CurrentIndex);
    32              INSERT INTO @SplitStringsTable([value]) VALUES(@ReturnText);
    33             
    34              --初始化开始截取字符串A的位置
    35              SELECT @CurrentIndex=@FindIndex+@SeparatorLen;
    36           END
    37      RETURN;
    38  END

    查询到的结果如下:

      select * from F_Split('12ab34ab56ab','ab')

  • 相关阅读:
    C#异步编程:多线程基础Thread类
    WPF:TextBox控件禁用中文输入
    C#:泛型的协变和逆变
    C#:泛型接口
    C#:泛型委托
    C#:泛型类
    Jetbrains Rider:缺少.NET Framework 4.5.2
    C#:泛型方法
    C#:泛型
    C#:接口
  • 原文地址:https://www.cnblogs.com/suflowers1700218/p/10281652.html
Copyright © 2020-2023  润新知