首页 > 技术文章 > SQL根据字符串B分隔字符串A

suflowers1700218 2019-01-17 12:55 原文

创建表值函数:

 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')

 

推荐阅读