昨天我问了一个类似的问题,但仍然没有基本理解为什么这个逻辑有效。我得到了正确的结果,我很满意,但为什么它的工作方式呢?
比方说我们正在使用这个简单的查询:
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]
...但是,如果它们两者合并,我得到的字符串是I需要......我不确定这是如何工作的,或者为什么会这样。任何人都可以向新秀解释这个吗?
答案 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