SQL - COALESCE和ISNULL之间的区别?

时间:2013-09-16 12:56:25

标签: sql sql-server

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

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

谢谢!

4 个答案:

答案 0 :(得分:57)

  

比较COALESCE和ISNULL

     

ISNULL函数和COALESCE表达式具有类似的用途,但行为可能不同。

     
      
  1. 因为ISNULL是一个函数,所以它只被评估一次。如上所述,   可以多次计算COALESCE表达式的输入值   倍。
  2.   
  3. 结果表达式的数据类型确定是   不同。 ISNULL使用第一个参数COALESCE的数据类型   遵循CASE表达式规则并返回值的数据类型   具有最高优先权。
  4.   
  5. 结果表达式的NULLability对于ISNULL和COALESCE是不同的。该   ISNULL返回值始终被视为NOT NULLable(假设返回值为a   不可空的一个)而具有非空参数的COALESCE是   被认为是NULL。所以表达式ISNULL(NULL,1)和   COALESCE(NULL,1)虽然等效,但具有不同的可空性   值。如果你在使用这些表达式,这会有所不同   计算列,创建键约束或返回值   标量UDF确定性的,以便可以如下所示进行索引   以下示例。
  6.   
> 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是数据库引擎中实现的内置函数。

ISNULLCOALESCE快。

MSDN

答案 3 :(得分:5)

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

ISNULL()只能有一个输入,不过它的显示速度比COALESCE略快。