我正在使用一个 T-SQLCOALESCE函数,其中第一个参数在大约 95% 的运行时间中不会为空。如果第一个参数是NULL,则第二个参数是一个相当漫长的过程:
COALESCE
NULL
SELECT COALESCE(c.FirstName ,(SELECT TOP 1 b.FirstName FROM TableA a JOIN TableB b ON .....) )
例如,如果,c.FirstName = 'John'SQL Server 是否仍会运行子查询?
c.FirstName = 'John'
我知道使用 VB.NETIIF()函数,如果第二个参数为 True,代码仍会读取第三个参数(即使它不会被使用)。
IIF()
不。这是一个简单的测试:
SELECT COALESCE(1, (SELECT 1/0)) -- runs fine SELECT COALESCE(NULL, (SELECT 1/0)) -- throws error
如果对第二个条件求值,则会引发除以零的异常。
根据MSDN 文档,这与COALESCE解释器的查看方式有关 - 这只是编写CASE语句的一种简单方法。
CASE
CASE众所周知,它是 SQL Server 中唯一(大部分)可靠短路的函数之一。
与 Aaron Bertrand 在此处的另一个答案中所示的标量变量和聚合进行比较时存在一些例外情况(这将同时适用于CASE和COALESCE):
DECLARE @i INT = 1; SELECT CASE WHEN @i = 1 THEN 1 ELSE MIN(1/0) END;
将产生除以零错误。
这应该被认为是一个错误,并且通常COALESCE会从左到右解析。