SQL - COALESCE和ISNULL的区别是什么?

62

COALESCE()和ISNULL(,'')之间的实际区别是什么?

在SQL连接中避免使用NULL值时,哪一个最好使用?

谢谢!


12
"coalesce" 是 SQL 标准定义的函数,几乎所有 DBMS 都支持使用。而 "isnull()" 只能在微软产品中使用。 - user330315
1
ISNULL 接受两个参数,COALESCE 可以接受 n 个参数,具体使用哪个取决于 SQL Server 的版本和需求。 - T I
1
MySQL 也有 isnull。 - Colonel Thirty Two
1
在提出这个问题之前,我已经找到了ISNULL vs COALESCE的答案。但是我想问的是在连接列时的实际差异(性能、最佳实践、代码行为等),这就是为什么我创建了一个新问题。如果这是一个重复的问题,我很抱歉。 - D. Caan
4个回答

88
比较COALESCE和ISNULL
ISNULL函数和COALESCE表达式有着类似的目的,但它们的行为可能不同。
因为ISNULL是一个函数,所以它只被评估一次。如上所述,COALESCE表达式的输入值可以被评估多次。
结果表达式的数据类型确定方式不同。ISNULL使用第一个参数的数据类型,而COALESCE遵循CASE表达式规则,并返回具有最高优先级的值的数据类型。
ISNULL和COALESCE的结果表达式的NULLability也不同。ISNULL返回值始终被认为是NOT NULLable(假设返回值是非可空的),而具有非空参数的COALESCE被认为是NULL。因此,尽管ISNULL(NULL, 1)和COALESCE(NULL, 1)等效,但它们具有不同的nullability值。如果您在计算列中使用这些表达式、创建关键约束或使标量UDF的返回值确定性,以便可以像下面的示例中所示那样进行索引,则会产生差异。
ISNULL和COALESCE的验证也不同。例如,对于ISNULL,NULL值被转换为int,而对于COALESCE,您必须提供数据类型。ISNULL只需要2个参数,而COALESCE需要可变数量的参数。

来源:BOL


8
此外,COALESCE仅是CASE表达式的一种简写方式,这意味着优化器会将其重写为使用CASE - Lamak
@paxdiablo Books OnLine,官方的SQL Server文档。抱歉,不确定它是否仍然被称为这个名字,但它曾经是这样的。 - SchmitzIT
1
啊,谢谢,这比我的尝试要清晰得多 :-) - paxdiablo
一个关于类型处理的示例(2):链接 - crokusek

20

主要的区别在于,COALESCE 是 ANSI-标准,所以您也可以在其他 RDBMS 中找到它,另一个区别是您可以给 COALESCE 提供一个整个值列表以进行检查,而对于 ISNULL,您只能传递一个值。


13

ISNULL是一个函数,它仅被评估一次。如上所述,COALESCE表达式的输入值可以被多次评估。 COALESCE基本上转换为CASE表达式,而ISNULL是数据库引擎中内置的实现。

MSDN


12
"ISNULL比COALESCE更快" [需要引用来源]。在哪些情况下?为什么?在SQL Server中,使用ISNULL函数要比COALESCE函数快。这是因为ISNULL函数只需要两个参数(即要检查的值和替代值),而COALESCE函数可以接受多个参数。此外,在某些情况下,SQL Server可以使用ISNULL函数的优化版本,从而进一步提高性能。 - underscore_d

9

COALESCE() 可以有多个输入,它会按顺序评估每一个输入,直到找到一个非空的值,例如 COALESCE(Col1, Col2, Col3, 'N/A')。微软推荐使用这个函数而不是 ISNULL()

ISNULL() 只能有一个输入,但已经被证明比 COALESCE 稍微快一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接