Sch*_*zIT 60
比较COALESCE和ISNULL
ISNULL函数和COALESCE表达式具有相似的目的,但行为可能不同.
- 因为ISNULL是一个函数,所以它只被评估一次.如上所述,可以多次评估COALESCE表达式的输入值.
- 结果表达式的数据类型确定是不同的.ISNULL使用第一个参数的数据类型,COALESCE遵循CASE表达式规则并返回具有最高优先级的值的数据类型.
- 对于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
DrC*_*ste 13
主要的区别在于,这COALESCE是ANSI-Standard,所以你也可以在其他RDBMS中找到它,另一个区别是你可以给出要检查的值的完整列表,COALESCE而ISNULL你只能传递一个.
COALESCE()可以有多个输入,它将按顺序进行评估,直到其中一个不为空,例如COALESCE(Col1, Col2, Col3, 'N/A').建议用MS而不是ISNULL()
ISNULL() 只能有一个输入,但它显示比COALESCE略快.
| 归档时间: |
|
| 查看次数: |
57503 次 |
| 最近记录: |