2013-09-16 145 views
22

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

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

谢谢!

+8

'coalesce'由SQL标准定义,并将努力在几乎所有的DBMS。 'isnull()'只适用于Microsoft产品。 –

+1

'ISNULL'有两个参数,'COALESCE'可以有'n'参数,它取决于SQL Server的要求和版本,以哪个为首选。 –

+0

MySQL也有isnull。 –

回答

46

COALESCE和ISNULL

ISNULL函数与COALESCE表达比较有相似的目的,但可以表现不同。

  1. 因为ISNULL是一个函数,所以它只被计算一次。如上所述,对于COALESCE表达式的输入值可以评估多次 次。
  2. 由此产生的表达式的数据类型确定为 不同。 ISNULL使用第一个参数的数据类型,COALESCE 遵循CASE表达式规则并返回具有最高优先级的值 的数据类型。
  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

+3

+1。更重要的是,'COALESCE'只是'CASE'表达式的快捷方式,这意味着优化器会将其重写为使用'CASE'而不是 – Lamak

+0

@paxdiablo Books OnLine是官方的SQL Server文档。对不起,不知道它还是叫它,但它曾经是。 – SchmitzIT

+1

啊,谢谢,这比我的尝试更有意义:-) – paxdiablo

0

COALESCE()可以有多个输入,它会为了评估直到其中的一个不为空,如COALESCE(Col1, Col2, Col3, 'N/A')。建议使用MS而不是ISNULL()

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

9

的主要区别是,COALESCE是ANSI标准,所以你还会发现它在其他RDBMS,其他不同的是,你可以给值的整个列表进行检查,以COALESCE而到ISNULL你只能通过一。

4

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

ISNULLCOALESCE更快。

MSDN

+3

_“'ISNULL '比'COALESCE'快。“[[需要的引证]]在哪些情况下?为什么? –