【问题标题】:Execution of ISNULL in SQL Server在 SQL Server 中执行 ISNULL
【发布时间】:2017-05-13 13:07:10
【问题描述】:

这是我如何使用 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

【问题讨论】:

  • 您是在问第二次选择是否只有在第一次选择返回 null 时才会发生?顺便说一句,选择不带 ORDER BY 子句的 TOP 1 实际上意味着您将获得一条随机记录,因为不保证不带 ORDER BY 子句的返回行的顺序。
  • if first value is not null Isnull 不会检查第二个条件里面的内容??

标签: sql-server aggregate-functions isnull


【解决方案1】:

将执行 ISNULL 内的两个查询,即使第一个查询将返回一个值。

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

创建和填充示例表:

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 )
)

执行计划图片:

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

【讨论】:

    【解决方案2】:

    我也在寻找答案。经过一番阅读,我得出了自己的方法来检查它。

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

    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,所以它会尝试第二个失败的查询

    【讨论】:

      【解决方案3】:

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

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

      这篇文章很好地回答了这个问题:

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

      【讨论】:

      • 虽然正确,但我认为这不是问题所在。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 2010-09-15
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      相关资源
      最近更新 更多