COALESCE()和ISNULL(,'')之间有什么实际区别?
在SQL连接中避免使用NULL值时,哪一个最适合使用?
谢谢!
答案 0 :(得分:57)
比较COALESCE和ISNULL
ISNULL函数和COALESCE表达式具有类似的用途,但行为可能不同。
- 因为ISNULL是一个函数,所以它只被评估一次。如上所述, 可以多次计算COALESCE表达式的输入值 倍。
- 结果表达式的数据类型确定是 不同。 ISNULL使用第一个参数COALESCE的数据类型 遵循CASE表达式规则并返回值的数据类型 具有最高优先权。
- 结果表达式的NULLability对于ISNULL和COALESCE是不同的。该 ISNULL返回值始终被视为NOT NULLable(假设返回值为a 不可空的一个)而具有非空参数的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
答案 1 :(得分:12)
主要区别在于,COALESCE
是ANSI-Standard,因此您也可以在其他RDBMS中找到它,另一个区别是您可以将要检查的值的完整列表提供给COALESCE
而对于ISNULL
,你只能传递一个。
答案 2 :(得分:7)
因为ISNULL
是一个函数,所以它只被评估一次。如上所述,可以多次评估COALESCE
表达式的输入值。
COALESCE
基本上转换为CASE
表达式,ISNULL
是数据库引擎中实现的内置函数。
ISNULL
比COALESCE
快。
答案 3 :(得分:5)
COALESCE()
可以有多个输入,它会按顺序进行评估,直到其中一个不为空,例如COALESCE(Col1, Col2, Col3, 'N/A')
。建议使用MS代替ISNULL()
ISNULL()
只能有一个输入,不过它的显示速度比COALESCE略快。