一尘不染

即使第一个参数不是 NULL,SQL Server 是否会读取所有 COALESCE 函数?

sql

我正在使用一个 T-SQLCOALESCE函数,其中第一个参数在大约 95% 的运行时间中不会为空。如果第一个参数是NULL,则第二个参数是一个相当漫长的过程:

SELECT COALESCE(c.FirstName
                ,(SELECT TOP 1 b.FirstName
                  FROM TableA a 
                  JOIN TableB b ON .....)
                )

例如,如果,c.FirstName = 'John'SQL Server 是否仍会运行子查询?

我知道使用 VB.NETIIF()函数,如果第二个参数为 True,代码仍会读取第三个参数(即使它不会被使用)。


阅读 94

收藏
2022-10-25

共1个答案

一尘不染

。这是一个简单的测试:

SELECT COALESCE(1, (SELECT 1/0)) -- runs fine
SELECT COALESCE(NULL, (SELECT 1/0)) -- throws error

如果对第二个条件求值,则会引发除以零的异常。

根据MSDN 文档,这与COALESCE解释器的查看方式有关 - 这只是编写CASE语句的一种简单方法。

CASE众所周知,它是 SQL Server 中唯一(大部分)可靠短路的函数之一。

与 Aaron Bertrand 在此处的另一个答案中所示的标量变量和聚合进行比较时存在一些例外情况(这将同时适用于CASECOALESCE):

DECLARE @i INT = 1;
SELECT CASE WHEN @i = 1 THEN 1 ELSE MIN(1/0) END;

将产生除以零错误。

这应该被认为是一个错误,并且通常COALESCE会从左到右解析。

2022-10-25