[英]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
[JKL]
? 现在,如果我们将COALESCE
修改为仅包含第一个参数[将@columns附加在最前面]
SELECT @columns = @columns + ',[' + cast(FakeColumn as varchar) + ']'
FROM #TestTable
GROUP BY FakeColumn
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.