1

我昨天问了一个类似的问题,但仍然没有基本理解为什么这个逻辑有效。我得到了正确的输出,对此我很满意,但是为什么它会以这种方式工作呢?

例如,我们正在使用这个简单的查询:

    create table #TestTable (FakeColumn varchar(50))
    INSERT INTO #TestTable (FakeColumn) VALUES ('ABC'),('DEF'),('GHI'),('JKL')

    DECLARE @columns VARCHAR(8000)

  SELECT @columns = COALESCE(@columns + ',[' + cast(FakeColumn as varchar) + ']',
  '[' + cast(FakeColumn as varchar)+ ']')
  FROM #TestTable
  GROUP BY FakeColumn

      select @columns

      drop table #TestTable

以下查询的输出是:[ABC],[DEF],[GHI],[JKL]这恰好是我所需要的......但是假设我们将查询修改为:

 SELECT @columns = '[' + cast(FakeColumn as varchar)+ ']'
 FROM #TestTable
 GROUP BY FakeColumn

 select @columns
  1. 为什么我现在的输出是:[JKL]

现在,如果我们修改COALESCE为仅包含第一个参数 [@columns 附加到前面]

  SELECT @columns = @columns + ',[' + cast(FakeColumn as varchar) + ']'
        FROM #TestTable
  GROUP BY FakeColumn
  1. 为什么我现在的输出是:NULL

看起来我在 COALESCE 语句中的第一个值返回 NULL,因此它应该转到我的第二个语句,但那只是返回[JKL]......但是,将它们结合起来,我得到了我需要的字符串......我不是确定这是如何工作的,或者为什么会这样。任何人都可以帮助向菜鸟解释这一点吗?

4

2 回答 2

0
 SELECT @columns = @columns + ',[' + cast(FakeColumn as varchar) + ']'
       FROM #TestTable
 GROUP BY FakeColumn

你这里的值是空的,因为你在选择之前声明了@column 没有任何值,所以初始值是空的。添加到 NULL varchar 的所有内容都将导致 NULL 结果

COALESCE 返回第一个非 NULL 值。

下面 COALESCE 中的第一个参数将返回 NULL,因为添加到 NULL 值的任何内容默认为 NULL(您的 @columns 变量为 NULL)。所以首先它会返回第二部分,然后当@columns 有一个值时,它将在 COALESCE 中添加第一部分

 SELECT @columns = COALESCE(@columns + ',[' + cast(FakeColumn as varchar) + ']',
 '[' + cast(FakeColumn as varchar)+ ']')
 FROM #TestTable
 GROUP BY FakeColumn
于 2013-08-16T14:25:19.820 回答
0

1.为什么我现在的输出是:[JKL]?

这很简单。您group by在查询中有 a ,因此它返回多行。只有一行提供对变量的赋值。哪一行是任意的。

1.为什么我现在的输出是:NULL?

这很简单。变量@columns初始化为NULL。连接任何东西来NULL生产NULL

于 2013-08-16T14:13:39.173 回答