需求:有四行數據,如下:
1.蘋果
2.橘子
3.桃子
4.波羅
合並成一個字段:蘋果,橘子,桃子,波羅;
需求明確之后,先弄點測試數據,上代碼:
--創建一個臨時表 Create table #temp ( testName varchar(20) ) --寫入測試數據 INSERT INTO #temp(testName) values('蘋果'); INSERT INTO #temp(testName) values('橘子'); INSERT INTO #temp(testName) values('桃子'); INSERT INTO #temp(testName) values('波羅'); --查詢寫入的數據 SELECT * FROM #temp --DELETE #temp
演示數據填充好了之后,我們可以有以下幾種方法實現需求:
一:
DECLARE @listStr VARCHAR(MAX); SELECT @listStr = ISNULL(@listStr+',','')+ testName FROM #temp SELECT @listStr
在上面的腳本代碼中,使用了ISNULL函數,也可以使用Coalesce函數,這兩個函數都有空值情況下處理字符串的功能,更深層次的區別參考這里;
那么問題來了,我為什么要使用ISNull或者Coalesce 函數呢?這是因為所有的數據行中如果不排除有空值的可能,最好加上空值判斷的處理,因為在SQLSERVER中,如果需要進行字符串拼接,遇到空值的話是無法拼接的。
二:使用for xml path('') 和stuff ;
SELECT ',' + testName FROM #temp for xml path('')
三:使用字符串函數 STRING_AGG,這個函數是SQLSERVER 2017 之后才有的。
SELECT STRING_AGG(ISNULL(testName,'N/A'), ',')
FROM #temp
查詢結果為:蘋果,橘子,桃子,N/A,波羅