【问题标题】:comma separated column values逗号分隔的列值
【发布时间】:2015-08-24 17:08:07
【问题描述】:

我需要从 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 是 ''):

这就是我得到的:

这是我实现的代码:

【问题讨论】:

  • 为什么要这样对自己?像这样存储数据违反了 1NF,只会带来痛苦。
  • several的例子说明如何在sql server中分割字符串。您尝试过其中任何一个吗? (也对@SeanLange 的评论 +1,更改您的数据)
  • @xQbert:这只在只有中间值为空的特定情况下才能解决。还有其他六种可能不起作用的情况。
  • 所有,我不存储这些数据。这是一个需要有这个“计算”列的报告。

标签: sql sql-server


【解决方案1】:

尝试使用这种技术:

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...

【讨论】:

  • KM,看看我的编辑。我实现了你所说的,但我仍然在中间领域遇到问题。
  • 没关系。我让它以 NULL 的形式出现(如果它是 NULL,而不是 '')
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    相关资源
    最近更新 更多