逗号分隔的列值

时间:2015-06-09 18:03:53

标签: sql sql-server

我需要从3列中获取值并将它们分组为1列,以逗号分隔:

2014-01-01,2014-01-29

问题是一个或多个列可能为NULL,因此它会使逗号混乱:

2014-01-01,,2014-01-29

这就是我编码的方式(case语句基本上只是删除逗号,如果它是字符串中的最后一个字符。

我需要添加一些逻辑,以便考虑到NULL,但我很难想出它。

CASE WHEN RIGHT(ISNULL(d.FirstGapDate + ',', '') + ISNULL(d.PayrollGapDate + ',', '') + d.LastGapDate, 1) = ',' 
     THEN LEFT(ISNULL(d.FirstGapDate + ',', '') + ISNULL(d.PayrollGapDate + ',', '') + d.LastGapDate, LEN(ISNULL(d.FirstGapDate + ',', '') + ISNULL(d.PayrollGapDate + ',', '') + d.LastGapDate) - 1)
     ELSE ISNULL(d.FirstGapDate + ',', '') + ISNULL(d.PayrollGapDate + ',', '') + d.LastGapDate
END AS AlLGapDatesFormatted

编辑 -

我需要对突出显示进行分组(注意PayrollGapDate是''):

这就是我得到的:

这是我实施的代码:

2 个答案:

答案 0 :(得分:5)

尝试使用这种技术:

SET CONCAT_NULL_YIELDS_NULL ON  --<<<make sure concatenations with NULL result in NULL

DECLARE @C1 varchar(10)='AAA'
       ,@C2 varchar(10)='BBB'
       ,@C3 varchar(10)=null
       ,@C4 varchar(10)='DDD'

SELECT  STUFF(    ISNULL(', '+@C1,'')
                 +ISNULL(', '+@C2,'')
                 +ISNULL(', '+@C3,'')
                 +ISNULL(', '+@C4,'')

                 ,1,2,''
             )

输出:

-----------------------------------------------
AAA, BBB, DDD

(1 row(s) affected)

您让', '+@C3结果为NULL,ISNULL(***,'')转换为空字符串。 STUFF(***,1,2,'')删除了前导逗号和空格。

尝试:

SELECT  STUFF(    ISNULL(', '+d.FirstGapDate,'')
                 +ISNULL(', '+d.PayrollGapDate,'')
                 +ISNULL(', '+d.LastGapDate,'')

                 ,1,2,''
             )
    FROM ...
    WHERE...

答案 1 :(得分:1)

您可以在表达式上方应用这样的内容,用一个逗号替换多个逗号:

declare @s varchar(100) = 'ABC,,,,DEF'

select replace(replace(replace(@s, ',', '[]'), '][', ''), '[]', ',')