在 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,所以它会尝试第二个失败的查询
下面是我如何使用 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,所以它会尝试第二个失败的查询