2016-12-29 102 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

雖然正確,但我不認爲這是個問題。 –