48

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

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

谢谢!

4

4 回答 4

77

比较 COALESCE 和 ISNULL

ISNULL 函数和 COALESCE 表达式具有相似的目的,但可以表现不同。

  1. 因为 ISNULL 是一个函数,所以它只计算一次。如上所述,可以多次计算 COALESCE 表达式的输入值。
  2. 结果表达式的数据类型确定是不同的。ISNULL 使用第一个参数的数据类型,COALESCE 遵循 CASE 表达式规则,返回优先级最高的 value 的数据类型。
  3. 对于 ISNULL 和 COALESCE,结果表达式的 NULLability 是不同的。ISNULL 返回值始终被认为是不可为空的(假设返回值是不可为空的),而具有非空参数的 COALESCE 被认为是 NULL。因此,表达式 ISNULL(NULL, 1) 和 COALESCE(NULL, 1) 虽然等效,但具有不同的可空性值。如果您在计算列中使用这些表达式、创建键约束或使标量 UDF 的返回值具有确定性以便可以按以下示例中所示对其进行索引,这会有所不同。
> USE tempdb; 
> GO

> -- This statement fails because the PRIMARY KEY cannot accept NULL values
> -- and the nullability of the COALESCE expression for col2 
> -- evaluates to NULL. 

> CREATE TABLE #Demo  (  col1 integer NULL,  col2 AS COALESCE(col1, 0) PRIMARY KEY,  col3 AS ISNULL(col1, 0)  ); 
> 
> -- This statement succeeds because the nullability of the 
> -- ISNULL function evaluates AS NOT NULL.
> 
> CREATE TABLE #Demo  (  col1 integer NULL,  col2 AS COALESCE(col1, 0), 
> col3 AS ISNULL(col1, 0) PRIMARY KEY  );

ISNULL 和 COALESCE 的验证也不同。例如,ISNULL 的 NULL 值转换为 int,而对于 COALESCE,您必须提供数据类型。ISNULL 仅采用 2 个参数,而 COALESCE 采用可变数量的参数。

资料来源:BOL

于 2013-09-16T12:58:51.190 回答
17

主要区别在于,这COALESCE是 ANSI 标准,因此您也可以在其他 RDBMS 中找到它,另一个区别是您可以提供要检查的值的完整列表,COALESCEISNULL您只能传递一个。

于 2013-09-16T13:00:09.897 回答
11

因为ISNULL是一个函数,所以它只被评估一次。如上所述,COALESCE可以多次计算表达式的输入值。 COALESCE基本上翻译为CASE表达式,ISNULL是在数据库引擎中实现的内置。

MSDN

于 2013-09-16T13:10:32.590 回答
7

COALESCE()可以有多个输入,它将按顺序计算,直到其中一个不为空,例如COALESCE(Col1, Col2, Col3, 'N/A'). 建议 MS 使用它而不是ISNULL()

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

于 2013-09-16T12:59:19.233 回答