以下是将多个列连接到一个字符串的起点,其中值以逗号分隔。如果列条目为空或NULL,则不应使用逗号:
IF OBJECT_ID(N'tempdb..#Temp') IS NOT NULL
DROP TABLE #Temp;
CREATE TABLE #Temp
(
Id INT,
Name1 NVARCHAR(10) ,
Name2 NVARCHAR(10) ,
Name3 NVARCHAR(10)
);
INSERT INTO #Temp
SELECT 1,
N'Name1' ,
NULL ,
N'Name3'
UNION
SELECT 2,
N'Name1' ,
N'Name2' ,
N'Name3'
UNION
SELECT 3,
NULL ,
NULL ,
N'Name3'
UNION
SELECT
4,
N'' ,
N'' ,
N'Name3';
SELECT Id, STUFF(COALESCE(N',' + Name1, N'') + COALESCE(N',' + Name2, N'')
+ COALESCE(N',' + Name3, N''), 1, 1, '') AS ConcateStuff
FROM #Temp;
目前的结果如下:
Id ConcateStuff
1 Name1,Name3
2 Name1,Name2,Name3
3 Name3
4 ,,Name3
一切都适用于NULL条目,但不适用于空条目。最后一行的结果应该是:
Name3
有没有一种简单的方法可以在不使用复杂的嵌套case语句的情况下使其工作(最终我必须连接超过3列)。
答案 0 :(得分:2)
通过使用NULLIF
,您可以实现它。
SELECT Id, STUFF(COALESCE(N',' + NULLIF(Name1, ''), N'') + COALESCE(N',' + NULLIF(Name2, ''), N'')
+ COALESCE(N',' + NULLIF(Name3, ''), N''), 1, 1, '') AS ConcateStuff
FROM #Temp;
<强>结果强>
Id ConcateStuff
-----------------
1 Name1,Name3
2 Name1,Name2,Name3
3 Name3
4 Name3
答案 1 :(得分:2)
<强> SQL2012 强>:
STUFF(CONCAT(',' + Name1, ',' + Name2, ',' + Name3), 1, 1, '')
STUFF(CONCAT(',' + NULLIF(Name1,''), ',' + NULLIF(Name2,''), ',' + NULLIF(Name3,'')), 1, 1, '')
<强> SQL2005 + 强>:
STUFF(ISNULL(','+Name1) + ISNULL(','+Name2) + ISNULL(','+Name2) , 1, 1, '')
STUFF(ISNULL(','+NULLIF(Name1,'')) + ISNULL(','+NULLIF(Name2,'')) + ISNULL(','+NULLIF(Name1,'')) , 1, 1, '')