[SQL]將某個欄位值以逗號串起來

[SQL]將某個欄位值以逗號串起來

image

如上面的所示,將某個欄位值以逗號串起來呢?

以下先建立一個資料表(TBL_1)裡面只有一個欄位(),然後新增3筆資料進去,如下,


USE tempdb
GO
CREATE TABLE TBL_1(
COL_1 VARCHAR(10)
);

INSERT INTO TBL_1 VALUES('C1');
INSERT INTO TBL_1 VALUES('C2');
INSERT INTO TBL_1 VALUES('C3');

SELECT COL_1 FROM TBL_1;

image

 

直覺就是定義一個變數,然後將值串接起來,如下,


--定義一個變數來儲存串接起來的值
DECLARE @Columns VARCHAR(MAX)
SELECT @Columns AS [@Columns]; --剛開始的值是NULL
--將 COL_1 欄位的值,加 逗號 再指定給 @Columns 變數
SELECT @Columns = @Columns + ',' + COL_1 FROM TBL_1;
SELECT @Columns AS [@Columns]; -- 結果仍然是 NULL !!!

image

可是為何串接出來的最後結果居然是NULL!

因為原本@Columns的值就是NULL,而任何值跟NULL做運算,出來還是NULL,所以結果就是NULL啦!

image

 

所以因為是NULL,所以一開始,我們將@Columns的值先Assign成空字串,應該就可以成功取到串接的值,如下,


--定義一個變數來儲存串接起來的值
DECLARE @Columns VARCHAR(MAX)
SET @Columns = '';
SELECT @Columns AS [@Columns]; --剛開始的值是''
--將 COL_1 欄位的值,加 逗號 再指定給 @Columns 變數
SELECT @Columns = @Columns + ',' + COL_1 FROM TBL_1;
SELECT @Columns AS [@Columns]; -- 結果為',C1,C2,C3'

image

image

可是前面多個逗號呢~

這時,就可以利用COALESCE函數(依序評估引數,並傳回起初未評估為 NULL 之第一個運算式的目前值。)來處理前面多一個逗號的問題。

因為第1筆資料,我們不想要有逗號,所以它的值應該是要為 COL_1 就好了,第2筆資料之後,才需要再加上逗號。

所以SELECT的運算式就會為 @Columns = COALESCE(@Columns + ',' + COL_1, COL_1) 。如下,


--定義一個變數來儲存串接起來的值
DECLARE @Columns VARCHAR(MAX)
SELECT @Columns AS [@Columns]; --剛開始的值是 NULL 
-- 第1筆資料時,因為@Columns為NULL,所以 COALESCE 會傳出 'C1'
-- 到第2筆資料時,因為@Columns為'C1',所以 COALESCE 會傳出 'C1' + ',' + 'C2'
SELECT @Columns = COALESCE(@Columns + ',' + COL_1, COL_1) FROM TBL_1;
SELECT @Columns AS [@Columns]; -- 結果為'C1,C2,C3'

image

image

所以,利用COALESCE函數的特性,就可以簡單的將某個欄位值以逗號串起來了~

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^