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

时间:2013-08-16 14:04:30

标签: sql sql-server tsql pivot coalesce

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

比方说我们正在使用这个简单的查询:

    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]
  2. 现在,如果我们将COALESCE修改为仅包含第一个参数[并在前面添加@columns]

      SELECT @columns = @columns + ',[' + cast(FakeColumn as varchar) + ']'
            FROM #TestTable
      GROUP BY FakeColumn
    
    1. 为什么我的输出现在是:NULL
    2. 看起来我COALESCE语句中的第一个值返回NULL,因此它应该转到我的第二个语句,但是它只返回[JKL] ...但是,如果它们两者合并,我得到的字符串是I需要......我不确定这是如何工作的,或者为什么会这样。任何人都可以向新秀解释这个吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

此处的值为null,因为您在select之前声明了@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