2016-12-29 103 views
1

以下是我如何使用ISNULL条件检查学生地址。 它工作正常,但ISNULL函数如何处理空的编码,即第一个条件为空时显示的第二个参数。在SQL Server中执行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 
+0

你是问如果第二选择将仅在第一选择返回空发生的呢?顺便说一句,选择没有ORDER BY子句的TOP 1实际上意味着你将得到一个随机记录,因为不保证没有ORDER BY子句返回的行的顺序。 –

+0

如果第一个值不为空Isnull不会检查第二个条件里面的内容? –

回答

4

即使第一个查询将返回一个值,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) 
) 

执行计划图像:

enter image description here

正如你可以清楚地看到,执行计划包括两个查询。

-1

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

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

这POST提供了这个问题一个很好的答案:

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

+0

虽然正确,但我不认为这是个问题。 –