COALESCE() 和 ISNULL(,'') 之间的实际区别是什么?
在 SQL 连接中避免 NULL 值时,最好使用哪一个?
谢谢!
比较 COALESCE 和 ISNULL
ISNULL 函数和 COALESCE 表达式具有相似的目的,但可以表现不同。
- 因为 ISNULL 是一个函数,所以它只计算一次。如上所述,可以多次计算 COALESCE 表达式的输入值。
- 结果表达式的数据类型确定是不同的。ISNULL 使用第一个参数的数据类型,COALESCE 遵循 CASE 表达式规则,返回优先级最高的 value 的数据类型。
- 对于 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
主要区别在于,这COALESCE
是 ANSI 标准,因此您也可以在其他 RDBMS 中找到它,另一个区别是您可以提供要检查的值的完整列表,COALESCE
而ISNULL
您只能传递一个。
因为ISNULL
是一个函数,所以它只被评估一次。如上所述,COALESCE
可以多次计算表达式的输入值。
COALESCE
基本上翻译为CASE
表达式,ISNULL
是在数据库引擎中实现的内置。
COALESCE()
可以有多个输入,它将按顺序计算,直到其中一个不为空,例如COALESCE(Col1, Col2, Col3, 'N/A')
. 建议 MS 使用它而不是ISNULL()
ISNULL()
只能有一个输入,但它被证明比 COALESCE 稍快。