[英]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.