SQL – COALESCE和ISNULL之间的区别?

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

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

谢谢!

比较COALESCE和ISNULL

ISNULL函数和COALESCEexpression式有相似的目的,但可以有不同的performance。

  1. 因为ISNULL是一个函数,所以只评估一次。 如上所述,可以多次评估COALESCEexpression式的input值。
  2. 结果expression式的数据types确定是不同的。 ISNULL使用第一个参数的数据types,COALESCE遵循CASEexpression式规则并返回优先级最高的值的数据types。
  3. 对于ISNULL和COALESCE,结果expression式的NULLability是不同的。 ISNULL返回值总是被认为不可空(假设返回值是不可空的),而具有非空参数的COALESCE被认为是NULL。 所以expression式ISNULL(NULL,1)和COALESCE(NULL,1)尽pipe等价的具有不同的可空性值。 如果您在计算列中使用这些expression式,则创build关键约束或使标量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的validation也不同。 例如,将ISNULL的NULL值转换为int,而对于COALESCE,则必须提供数据types。 ISNULL只需要2个参数,而COALESCE则需要可变数量的参数。

来源: BOL

主要区别在于, COALESCE是ANSI标准,所以你也可以在其他RDBMS中find它,另一个区别是你可以给一个完整的值列表来检查到COALESCE而对于ISNULL你只能通过一个。

因为ISNULL是一个函数,所以只评估一次。 如上所述,可以多次评估COALESCEexpression式的input值。 COALESCE基本上转换为CASEexpression式,而ISNULL是数据库引擎中实现的一个内置的。

ISNULLCOALESCE快。

MSDN

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

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