SQL – COALESCE和ISNULL之间的区别?
COALESCE()和ISNULL(,'')之间的实际区别是什么?
在SQL连接中避免NULL值时,哪一个最适合使用?
谢谢!
比较COALESCE和ISNULL
ISNULL函数和COALESCEexpression式有相似的目的,但可以有不同的performance。
- 因为ISNULL是一个函数,所以只评估一次。 如上所述,可以多次评估COALESCEexpression式的input值。
- 结果expression式的数据types确定是不同的。 ISNULL使用第一个参数的数据types,COALESCE遵循CASEexpression式规则并返回优先级最高的值的数据types。
- 对于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
是一个函数,所以只评估一次。 如上所述,可以多次评估COALESCE
expression式的input值。 COALESCE
基本上转换为CASE
expression式,而ISNULL
是数据库引擎中实现的一个内置的。
ISNULL
比COALESCE
快。
MSDN
COALESCE()
可以有多个input,它将按顺序进行评估,直到其中的一个不为空,例如COALESCE(Col1, Col2, Col3, 'N/A')
。 build议使用MS而不是ISNULL()
ISNULL()
只能有一个input,但是它显示比COALESCE稍快。