隐藏

MSSQL—字符串分离(Split函数)

发布:2023/6/3 14:33:23作者:管理员 来源:本站 浏览次数:587

前面提到了记录合并,有了合并需求肯定也会有分离需求,说到字符串分离,大家肯定会想到SPLIT函数,这个在.NET,Java和JS中都有函数,很可惜在SQL SERVER中没有,我们只能自己来写这么一个函数。


首先来分析一下怎么写这个函数,以之前合并的字符串为例,“张三,李四,王五,钱六,赵七,Tom,Amy,Joe,Leo”,现在要将此字符串按照“,”进行分离得到一组数据,现在可以得出这个函数传入变量有两个,一个是目标字符串,我们定义为@string,数据类型为nvarchar(500),选择nvarchar()是为了兼顾所有Unicode字符集,比如中文;另一个变量为分隔符,我们定义为@separator,数据类型为nvarchar(10),输出变量则定义为@array,一个单列列名为String,数据类型为nvarchar(500)的Table。


下面来分析具体的拆分方法,以字符串“张三,李四,王五,钱六,赵七,Tom,Amy,Joe,Leo”为例,首先得找到第一个“,”,然后把“张三”截取出来,然后将目标字符串变成“李四,王五,钱六,赵七,Tom,Amy,Joe,Leo”,然后再找第一个“,”,把“李四”截取出来,依次类推,直到找不到“,”,有了这个思路,下面就直接实现,查找字符串在程序语言中一般用indexOf方法,截取一般用Substring方法,SQL SERVER中有SUBSTRING函数用来截取字符串,但是没有indexOf查找函数,取而代之的是CHARINDEX和PATINDEX函数,CHARINDEX用于完全匹配查找,而PATINDEX用于模糊匹配查找,根据我们的需求,选用CHARINDEX函数,整个SPLIT函数代码如下:


   CREATE FUNCTION [dbo].[SPLIT]


   (


   -- Add the parameters for the function here


   @string nvarchar(500),  


       @separator nvarchar(10)


   )


   RETURNS @array TABLE(String nvarchar(500))


   AS


   BEGIN


   -- Declare the return variable here


   DECLARE @separatorIndex int,@tempString nvarchar(500),@tagString nvarchar(500)


   -- Add the T-SQL statements to compute the return value here


       SET @tagString=@string


   SET @separatorIndex=CHARINDEX(@separator,@tagString)  


       WHILE(@separatorIndex<>0)


   BEGIN


           SET @tempString = SUBSTRING(@tagString,1,@separatorIndex-1)  


           INSERT INTO @array(String) VALUES(@tempString)  


           SET @tagString = SUBSTRING(@tagString,@separatorIndex+1,LEN(@tagString)-@separatorIndex)  


           SET @separatorIndex=CHARINDEX(@separator,@tagString)  


       END  


       SET @tempString = @tagString  


       IF (LEN(@tempString)>0)  


           INSERT INTO @array(String) VALUES(@tagString)  


   -- Return the result of the function


   RETURN


   END


   GO


接着测试一下:


   SELECT * FROM dbo.SPLIT(N'张三,李四,王五,钱六,赵七,Tom,Amy,Joe,Leo',',')