优秀的编程知识分享平台

网站首页 > 技术文章 正文

数据库大师成长日记:巧用SQL内置函数分割字符串

nanyue 2024-08-27 18:03:29 技术文章 5 ℃

记得数年前写SQL脚本的时候,我需要把字符串根据某个特定字符分割出来使用,因为SQL Server是没有提供分割函数的,所以自己搞了个自定义函数来实现,实现过程当然是麻烦的。

使用传统方式实现字符串分割

首先传入原字符串和分隔符号作为参数,在函数体内部,通过while循环逐个判断字符串找到分割点,最终再返回表变量实现字符串的分割。

还好当年搞的SQL脚本还保存着,有兴趣的朋友可以参考一下:

create function [dbo].[fn_char_splitbystr](
 @String nvarchar(4000),function
 @Delimiter nvarchar(100)
) 
returns @ValueTable table ([FValue] nvarchar(4000),[FSerial] int)
as
begin
 declare @value nvarchar(4000),@val nvarchar(4000)
 declare @NextString nvarchar(4000),@Pos int,@NextPos int,@CommaCheck nvarchar(1),@id int
 set @value=@String
 set @id=1
 set @NextString=''
 set @CommaCheck=right(@value,1)
 set @value=@value+@Delimiter+space(len(@Delimiter)-1)
 set @Pos=charindex(@Delimiter,@value)
 set @NextPos = 1
 while (@pos<>0) begin
 set @NextString=substring(@value,1,@Pos-1)
 set @val=@NextString
 if @id>1 set @val=substring(@val,len(@Delimiter),len(@val))
 insert into @ValueTable([FValue],[FSerial]) VALUES (@val,@id)
 set @value=substring(@value,@pos+1,LEN(@value))
 set @NextPos=@Pos
 set @pos=charindex(@Delimiter,@value)
 set @id=@id+1
 end
 return
end

运行示例参考下图:

返回的数据,就是一个表变量,可直接使用。但如果您看了自定义函数的处理过程,肯定会觉得好复杂。后来在查阅SQL Server 2016新语法的时候,赫然发现提供了内置的字符串分割函数STRING_SPLIT,可以说让我相当惊喜,我们今天就研究下这个函数的用法。

使用STRING_SPLIT分割字符串

使用string_split函数来分割字符串,那可就简单多了,我们先看看string_split的语法约定:

STRING_SPLIT(string,separator) 

string为任何字符类型(例如nvarchar、varchar、nchar或char)的表达式。

separator为任何字符类型(例如nvarchar(1)、varchar(1)、nchar(1)或 char(1))的单字符表达式。

返回值就是子字符串的表变量。其中列名为“value”。

看上去似乎与我们自己写的自定义函数没多少区别吧,我们先来体验下效果:

不出所料,返回的数据基本就是我们需要的分割要求。

如果仔细观察,您可能会发现其实string_split还是有一定的弊端的:比如分隔符号只可以是单个的字符、不可以是一个字符串,还有就是缺乏顺序号等。其实顺序号很容易解决,通过自增字段就行了,但分隔符号的问题是硬伤。所以,如果您要求的分隔符不是单个字符,使用自定义函数还是有必要的。

希望对您有所帮助!

最近发表
标签列表