一尘不染

COALESCE 与 ISNULL 的性能差异?

sql

我见过很多人使用 COALESCE 函数代替 ISNULL。从互联网搜索中,我发现 COALESCE 是 ANSI 标准,因此我们知道使用它时会发生什么是一个优势。然而, ISNULL 似乎更容易阅读,因为它似乎更清楚它在做什么。

我也意识到 ISNULL 有点棘手,因为它在不同的数据库服务器和不同的语言上表现不同。

在我看来,所有这些都归结为风格和标准。鉴于风格是主观的,是否有任何理由使用 COALESCE 而不是 ISNULL(反之亦然)?具体来说,一个比另一个有性能优势吗?


阅读 109

收藏
2022-10-27

共2个答案

一尘不染

COALESCE在内部翻译为CASE表达式,ISNULL是内部引擎函数。

COALESCE是ANSI标准函数,ISNULL是T-SQL。

2022-10-27
一尘不染

  • ISNULL 特定于 Sybase/SQL Server
  • COALESCE 是便携式的

然后

  • ISNULL 接受 2 个参数
  • COALESCE 接受 1-n 个参数

最后,还有有趣的一点。结果数据类型和长度/精度/比例

最后一点是为什么通常使用 ISNULL 的原因,因为它更可预测(?)并且 COALESCE 可以添加意外的数据类型转换:这就是“它更慢”位的来源

DECLARE @len10 varchar(10); --leave it NULL
SELECT
    ISNULL(@len10, '0123456789ABCDEF'),     -- gives 0123456789
    COALESCE(@len10, '0123456789ABCDEF');   -- gives 0123456789ABCDEF

所有数据类型都相同,您不会看到任何实际差异......

2022-10-27