0%

【SQL】Split

今天遇到一個需求如下
Table1 T1
裡面有問候語加上一群使用者的代碼(用逗號區隔開來)

Table1 T2
裡面有使用者代碼跟其對應的名稱

目標搜尋出來的結果如下:
意即代碼要被換成其對應的名稱

首先先建立一個可以將分隔符號拆開,並且去搜尋對應名稱的function (抓網路上高手寫的Code回來修改而成) ```sql
create FUNCTION [dbo].[ufn_Split]( @InputString nvarchar(4000))
RETURNS varchar(1000) –執行這個function會回傳字串
AS
BEGIN
–用來儲存分隔符號的Index
DECLARE @CIndex smallint
–用來串接字串並最後回傳回去的字串
declare @OutputString varchar(1000) =’’
declare @tempString varchar(500) =’’

WHILE (@InputString<>’’)
BEGIN
SET @CIndex=CHARINDEX(‘,’,@InputString) –抓到第一個分隔符號的Index
IF @CIndex=0 SET @CIndex=LEN(@InputString)+1

–將第一組代碼拆解出來並帶到T2去搜尋對應的名稱,如果搜尋出來為null的話則當作空字串處理
set @tempString = isnull((select name from t2 where id = (SUBSTRING(@InputString,1,@CIndex-1))),’’)

–這串if else純粹只是要解決多餘的逗號問題而已,就不多加解釋了
if @tempString <> ‘’
begin
if @OutputString = ‘’
begin
set @OutputString = @tempString
end
else
set @OutputString = @OutputString +’,‘+@tempString
end

IF @CIndex=LEN(@InputString)+1 BREAK

–把剛剛搜尋過的代碼挑掉後,剩下的繼續跑迴圈
SET @InputString=SUBSTRING(@InputString,@CIndex+1,LEN(@InputString)-@CIndex)
END
RETURN @OutputString
END

1
2
3
4

最後SQL command如下,就可以得到上述合併的結果了!!! ```sql
select title,dbo.ufn_Split(number) from t1