在 SQL 服务器中执行 ISNULL

Execution of ISNULL in SQL Server

下面是我如何使用 ISNULL 条件检查学生地址。 它工作正常,但 ISNULL 函数如何处理空编码,即如果第一个条件为空,则显示第二个参数。

当第一个条件不为空时,是否会计算第二个参数的值?

select 
   ...
   ...
   (CASE 
      WHEN st.ADDRESS='Y' THEN st.LOCATION
        ELSE 
          ISNULL(
                 (SELECT TOP 1 STDLOC.LOCATION FROM STDLOC 
                  INNER JOIN COMLOC ON STKLOC.LOCATION=COMLOC.CODE  AND COMLOC.ADDRESS='Y' 
                  WHERE STDLOC.ZIBCODE=st.ZIBCODE)
                ,(SELECT TOP 1 COMLOC.LOCATION  FROM COMLOC COMLOC.ZIBCODE=st.ZIBCODE))                       
       END
        ) AS STDUDENTLOCATION
   FROM STUDENT st

ISNULL 中的两个查询都将被执行,即使第一个查询将 return 一个值。

这是我做的一个简单测试:

创建并填充示例 table:

DECLARE @T AS TABLE
(
    Col int
)
INSERT INTO @T Values(1),(2)

SELECT ISNULL(
    (SELECT TOP 1 Col FROM @T ORDER BY Col DESC), 
    (SELECT TOP 1 Col FROM @T ORDER BY Col )
)

执行计划图片:

如您所见,执行计划包括两个查询。

ISNULL 是一个 T-SQL 特定函数,如果第一个参数为 NULL(https://msdn.microsoft.com/en-us/library/ms184325.aspx).[=12=,它将使用指定的第二个参数作为 return 值]

如果要return来自多个参数的第一个非空值,请使用 COALESCE 函数,这是所有类型的关系数据库都支持的标准函数。

这个 POST 很好地回答了以下问题:

Is Sql Server's ISNULL() function lazy/short-circuited?

我也在寻找答案。看了一些书后,我用自己的方法来检查它。

除以零会报错,可以试试:

SELECT ISNULL( (SELECT TOP 1 object_id FROM sys.columns), 5 / 0)

这将给出正确的结果。但是

SELECT ISNULL( (SELECT TOP 0 object_id FROM sys.columns), 5 / 0)

它会抛出错误,因为第一个查询的结果为 NULL,所以它会尝试第二个失败的查询