当我传递NULL值时,COALESCE函数不起作用,但是当将变量声明为NULL时,它起作用

时间:2018-08-14 10:37:09

标签: sql sql-server

当我执行以下查询时,我得到了输出,但是当我传递NULL参数时,它不起作用。

示例1:

DECLARE 
@a int = NULL,
@b int = NULL,
@c int = NULL
SELECT COALESCE(@a, @b,@c)
GO
  

输出:NULL

示例2:

SELECT COALESCE(NULL, NULL,NULL)
GO
  

输出:COALESCE的至少一个参数必须为   不是NULL常量的表达式。

有人可以解释为什么示例1有效但示例2无效。

2 个答案:

答案 0 :(得分:5)

我认为错误非常清楚:coalesce()“需要”一个非常数参数,而不是NULL。因此,语法对显式NULL施加了简单的限制。请注意,此错误是编译时间错误,而不是 run 时间错误。

您的问题确实似乎是:“为什么要对显式NULL而不是对变量进行检查?”因为它可以在编译阶段轻松进行检查。尽管编译器可以跟踪您的情况下的默认值,但是任何中间分配都会使该问题成为编译器无法解决的问题。因此,SQL Server只是说“我不知道变量是否为NULL”,并且该语句可以正常编译。

答案 1 :(得分:1)

答案是从SQL Server返回的错误消息中。至少,COALESCE的参数之一必须是非NULL常量的表达式。

除了测试是否捕获了此错误之外,我无法想到一个原因,以便使用多个NULL值执行查询,在该查询中没有包含不是NULL常量的参数。

您想实现什么?