以逗号分隔的字符串

时间:2016-06-06 15:20:47

标签: sql sql-server tsql sql-server-2014

以下是将多个列连接到一个字符串的起点,其中值以逗号分隔。如果列条目为空或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列)。

2 个答案:

答案 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, '')