SQL - COALESCE和ISNULL之间的区别?

D. *_*aan 32 sql sql-server

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

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

谢谢!

Sch*_*zIT 60

比较COALESCE和ISNULL

ISNULL函数和COALESCE表达式具有相似的目的,但行为可能不同.

  1. 因为ISNULL是一个函数,所以它只被评估一次.如上所述,可以多次评估COALESCE表达式的输入值.
  2. 结果表达式的数据类型确定是不同的.ISNULL使用第一个参数的数据类型,COALESCE遵循CASE表达式规则并返回具有最高优先级的值的数据类型.
  3. 对于ISNULL和COALESCE,结果表达式的可空性是不同的.ISNULL返回值始终被视为NOT NULLable(假设返回值是非可空的),而具有非null参数的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  );
Run Code Online (Sandbox Code Playgroud)

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

资料来源:BOL

  • +1.更重要的是,`COALESCE`只是`CASE`表达式的快捷方式,这意味着优化器会将其重写为使用`CASE`而不是 (4认同)

DrC*_*ste 13

主要的区别在于,这COALESCE是ANSI-Standard,所以你也可以在其他RDBMS中找到它,另一个区别是你可以给出要检查的值的完整列表,COALESCEISNULL你只能传递一个.


Sur*_*ngh 8

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

ISNULL比...更快COALESCE.

MSDN

  • _"`ISNULL`比`COALESCE`快."_ [需要引证].在哪些情况下?为什么? (10认同)

Mik*_* M. 5

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

ISNULL() 只能有一个输入,但它显示比COALESCE略快.