使用编写SQL查询时COALESCE
,我注意到在特定情况下,对于一个无效的列名,它将引发多个错误。
如果我编写以下查询并尝试执行该查询,简而言之,我会收到一条错误消息,告诉我我是个白痴,并且该列不存在。
DECLARE @a TABLE (Column1 INT, Column2 INT)
-- This will return one error, complaining about NeverHeardOfIt
SELECT
COALESCE
(
Column1,
Column2,
NeverHeardOfIt
)
FROM @a
消息207,级别16,状态1,第8行无效的列名'NeverHeardOfIt'。
但是,如果我稍稍更改查询以将无效列放在COALESCE
语句的前面,则会收到两个错误:
DECLARE @a TABLE (Column1 INT, Column2 INT)
-- This will return two errors, both complaining about NeverHeardOfIt
SELECT
COALESCE
(
Column1,
NeverHeardOfIt,
Column2
)
FROM @a
消息207,级别16,状态1,第7行无效的列名称'NeverHeardOfIt'。
消息207,级别16,状态1,第7行无效的列名称'NeverHeardOfIt'。
我已经测试了几种不同的方案,并且似乎只有在我合并三个或更多列且无效列不是最后一列时才会发生。显然,“修复”很容易-不要引用无效的列!但是我很好奇,为什么COALESCE()
函数会两次抛出相同的错误呢?我所能想到的最好的是,在幕后,SQL正在编写多个语句,这些语句大致如下:
如果列1为NULL,请使用NeverHeardOfIt
如果NeverHeardOfIt为NULL,则使用Column2
如果Column2为NULL ...
如果是这样的话,那么当我执行它时,我可以看到该函数将如何/为什么为幕后生成的每个“语句”返回错误。
有谁知道这是正确的,还是知道另一个原因会返回两个错误?
我认为双重错误消息是一个错误,但是很小。但是,原因是coalesce()
(choose()
以及)确实是简写。所以:
coalesce(a, b, c)
是真的:
(case when a is not null then a
when b is not null then b
else c
end)
请注意,最后一个元素仅出现一次-因此,当缺少的列位于末尾时,只会出现一个错误。
这看起来像是一个神秘的细节,但实际上很重要。例如,如果值之一是子查询-并且子查询的运行可能很昂贵-则在的评估中它将运行两次coalesce()
。如果性能是一个问题,并且一个或多个值是子查询,那么即使我更喜欢isnull()
在这些情况下其性能也更好。通常,我偏向使用ANSI标准函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句