繁体   English   中英

了解TSQL和COALESCE在PIVOT中具有动态列

[英]Understanding TSQL and COALESCE to have dynamic columns in a PIVOT

昨天我曾问过类似的问题,但对于这种逻辑为何有效,仍然没有基本的了解。 我得到了正确的结果,对此我感到满意,但是为什么它会像以前那样运作呢?

假设我们正在使用以下简单查询:

    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] ...但是,将它们两个结合在一起,我得到了我需要的字符串...我我不确定这是如何工作的,或者为什么会这样。 任何人都可以帮助向菜鸟解释吗?

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

这很容易。 您在查询中有一个group by ,因此它返回多行。 仅一行提供了对该变量的分配。 哪一行是任意的。

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

这很容易。 变量@columns初始化为NULL 将任何内容连接为NULL产生NULL

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

您此处的值为空,因为您在选择之前声明了@column而不包含任何值,因此初始值为NULL。 所有添加到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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM