我见过很多人使用 COALESCE 函数代替 ISNULL。从互联网搜索中,我发现 COALESCE 是 ANSI 标准,因此我们知道使用它时会发生什么是一个优势。然而, ISNULL 似乎更容易阅读,因为它似乎更清楚它在做什么。
我也意识到 ISNULL 有点棘手,因为它在不同的数据库服务器和不同的语言上表现不同。
在我看来,所有这些都归结为风格和标准。鉴于风格是主观的,是否有任何理由使用 COALESCE 而不是 ISNULL(反之亦然)?具体来说,一个比另一个有性能优势吗?
我见过很多人使用 COALESCE 函数代替 ISNULL。从互联网搜索中,我发现 COALESCE 是 ANSI 标准,因此我们知道使用它时会发生什么是一个优势。然而, ISNULL 似乎更容易阅读,因为它似乎更清楚它在做什么。
我也意识到 ISNULL 有点棘手,因为它在不同的数据库服务器和不同的语言上表现不同。
在我看来,所有这些都归结为风格和标准。鉴于风格是主观的,是否有任何理由使用 COALESCE 而不是 ISNULL(反之亦然)?具体来说,一个比另一个有性能优势吗?
然后
最后,还有有趣的一点。结果数据类型和长度/精度/比例
最后一点是为什么通常使用 ISNULL 的原因,因为它更可预测(?)并且 COALESCE 可以添加意外的数据类型转换:这就是“它更慢”位的来源
所有数据类型都相同,您不会看到任何实际差异......
COALESCE
在内部翻译为CASE
表达式,ISNULL
是内部引擎函数。COALESCE
是ANSI标准函数,ISNULL
是T-SQL。Performance differences can and do arise when the choice influences the execution plan but the difference in the raw function speed is miniscule .
正如 Mark 指出的那样,您将很难找到性能差异。我认为其他因素会更重要。对我来说,我总是使用 COALESCE,其中大部分已经被你或 Mark 提到过:
如果您使用不同的数据类型/精度等,您还应该确保您知道如何使用这两个函数处理数据类型优先级。
笔记
有一个例外。这些在当前版本的 SQL Server 中处理方式不同:
该
COALESCE
变体实际上会执行some_aggregate_query
两次(一次检查值,一次返回非零值),而ISNULL
只会执行一次子查询。我在这里谈谈其他一些区别: