【问题标题】:Concat 2 columns based on ID in SQL ServerSQL Server中基于ID的Concat 2列
【发布时间】:2020-06-23 16:57:38
【问题描述】:

我正在尝试基于相同的 ID 合并 2 列,但遇到一个问题,即 2 列中的任何一个为空值会使结果为空

数据看起来像这样

 ID  Notes      Date
-----------------------
 1   notes1     3/1/20
 1   notes2     3/2/20
 1   notes3     3/3/20
 2   notes1
 2   notes2

期望的输出

Id    CombinedNotes
-------------------------------------------------------------------------
1     Date: 3/1/20 Notes: Notes1 Date: 3/2/20 Notes: Notes2 Date: 3/3/20 Notes: Notes3
2     Date: NUll Notes: Notes1 Date: Null Notes: Notes2

实际电流输出为:

Id    CombinedNotes
-----------------------------------------------------------------------------
1     Date: 3/1/20 Notes: Notes1 Date: 3/2/20 Notes: Notes2 Date: 3/3/20 Notes: Notes3
2     Null

我正在运行这个查询

SELECT DISTINCT
    t2.[id],
    STUFF ((SELECT ' Date: ' + t1.[date] + ' Notes:' + [notes]   
            FROM [dbo].[test1] t1
            WHERE t1.[id] = t2.[id]
            FOR XML PATH ('')), 1, 2, '')
FROM
    [dbo].[test1] t2  

结果如下所示:

我应该改变什么,如果它是空白的,是否可以没有这样的“日期:”,所以所需的输出看起来像这样

 2        Notes: Notes1 Notes: Notes2

谢谢

【问题讨论】:

  • 您的 SQL Server 版本是多少?
  • function CONCAT() 比简单的+ 连接更智能...

标签: sql sql-server xml concatenation ssms


【解决方案1】:

{Some string} + {NULL Value} = NULL这就是问题所在。正如您所拥有的 ' Date: ' + t1.[date] + ' Notes:' + [notes] 这将转换为 ' Date:' + '3/1/20' + 'Notes:' + NULL 返回 NULL

使用ISNULL(或COALESCE)返回文字值'NULL'

' Date: '  + t1.[date] + ' Notes:' + ISNULL([notes],'NULL')

旁注:另外,因为您将t1.[date] 包装在CONVERT/CAST 中,所以强烈 意味着[date] 不是date,而是@ 987654334@。你真的应该在那里修复你的数据类型。以日期(和时间)数据类型存储日期。 varchar 不是“一刀切”的数据类型。

另外,您还有一个问题是值类似于'3/1/20' 那是什么日期? 2020 年 1 月 3 日? 1920 年 3 月 1 日? 2003 年 1 月 20 日?名单还在继续。该列需要修复。

【讨论】:

  • 谢谢,如果日期为空且注释不为空,也可以应用同样的方法吗?
  • 正确,@gauravk。不过,真正的收获是修复date的数据类型。
  • 感谢 Larnu 的帮助和建议。在实际的数据库中,所有内容的格式都是正确的,但我只是想看看如何才能正确完成这一步。
  • “一切都在正确的格式”,如果是这种情况,@gauravk,那么上面将返回错误“无法纠正 varchar 值” Date: ' 迄今为止。您没有收到该错误的事实足以证明[date] 不是date
  • 我确实收到了错误,但现在已经修复并且可以正常工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多