【问题标题】:How does sql returns all rows when concating declared column and defining it?连接声明的列并定义它时,sql如何返回所有行?
【发布时间】:2015-10-22 13:00:01
【问题描述】:

这在 SQL 中怎么可能?

DECLARE @liststr VARCHAR(MAX)
;WITH COMMA (name)
AS
(
    SELECT 'a' 
    UNION
    SELECT 'b'
    UNION
    SELECT 'c'
    UNION
    SELECT 'd'
)
SELECT @liststr = CASE WHEN  @liststr+',' IS NULL THEN '' ELSE @liststr+',' END + name 
FROM comma

SELECT @liststr as Result

上述查询返回以下结果

+---------+
| Result  |
+---------+
| a,b,c,d |
+---------+

如果我们删除 case 语句。

DECLARE @liststr VARCHAR(MAX)
;WITH COMMA (name)
AS
(
    SELECT 'a' 
    UNION
    SELECT 'b'
    UNION
    SELECT 'c'
    UNION
    SELECT 'd'
)
SELECT @liststr = @liststr+',' + name FROM comma
SELECT @liststr as Result

结果是

+--------+
| Result |
+--------+
| NULL   |
+--------+

【问题讨论】:

    标签: sql sql-server database tsql case


    【解决方案1】:

    一点也不。当 SQL Server 将字符串连接到 NULL 值时,该值为 NULL

    如果先将值设置为空字符串,则两者都将返回相同的值:

    DECLARE @liststr VARCHAR(MAX);
    SET @liststr = '';
    

    两个音符:

    • 使用union all 而不是union,除非您明确希望承担删除重复项的开销。
    • 运行查询时,结果的顺序是任意的。如果您需要特定订单,请使用order by

    请注意,Erland Sommarskog 表示这种组合字符串的方法不受支持。尽管他在这个特定的答案中推荐了一个游标,但我会使用 XML。

    【讨论】:

    • 只是为了记录,这也可能有助于了解:CONCAT_NULL_YIELDS_NULL
    • @Pred :现在我完全理解你的一行评论...... :)
    【解决方案2】:

    可以使用SQL Server的CONCAT函数:

    SELECT @liststr = CONCAT(@liststr, ',', name) FROM comma
    SELECT @liststr AS myString 
    

    所以如果CONCAT中有一个参数为NULL,就会被一个空字符串代替。

    【讨论】:

      猜你喜欢
      • 2015-07-26
      • 1970-01-01
      • 2014-12-07
      • 2021-11-14
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      相关资源
      最近更新 更多