MSSQL—字符串分離(Split函數)


前面提到了記錄合並,有了合並需求肯定也會有分離需求,說到字符串分離,大家肯定會想到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',',')

可以得到如下結果:

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM