Sql-Server

SQL Server CASE 語句是否評估所有條件或在第一個 TRUE 條件時退出?

  • January 22, 2021

SQL Server(特別是 2008 或 2012)CASE語句是評估所有WHEN條件還是在找到WHEN評估為 true 的子句後退出?如果它確實通過了整個條件集,這是否意味著最後一個條件評估為 true 會覆蓋第一個評估為 true 的條件所做的事情?例如:

SELECT
   CASE
       WHEN 1+1 = 2 THEN'YES'
       WHEN 1+1 = 3 THEN 'NO'
       WHEN 1+1 = 2 THEN 'NO' 
   END

結果是“是”,即使最後一個條件應使其評估為“否”。一旦找到第一個 TRUE 條件,它似乎就退出了。有人可以確認是否是這種情況

• 返回計算結果為 TRUE的****第一個input_expression = when_expression的 result_expression 。

參考 https://docs.microsoft.com/sql/t-sql/language-elements/case-transact-sql


這是標準的 SQL 行為:

  • CASE表達式計算為第一個真條件。
  • 如果不存在真條件,則評估該ELSE部分。
  • 如果不存在真實條件且沒有ELSE部分,則計算結果為NULL

SQL Server 通常對 CASE 語句 ( SQLFiddle )進行短路評估

--Does not fail on the divide by zero.
SELECT 
  CASE 
     WHEN 1/1 = 1 THEN 'Case 1'
     WHEN 2/0 = 1 THEN 'Case 2'
  END;

--Fails on the divide by zero.
SELECT 
  CASE 
     WHEN 1/1 = 99 THEN 'Case 1'
     WHEN 2/0 = 99 THEN 'Case 2'
  END;  

但是,從 SQL Server 2012 開始,有幾種類型的語句不能正確短路。請參閱評論中來自 ypercube 的連結。

Oracle 總是做短路評估。請參閱11.2 SQL 語言參考。或者比較以下(SQLFiddle):

--Does not fail on the divide by zero.
SELECT
 CASE 
   WHEN 1/1 = 1 THEN 'Case 1'
   WHEN 2/0 = 1 THEN 'Case 2'
 END
FROM dual;


--Fails on the divide by zero.
SELECT
 CASE 
   WHEN 1/1 = 99 THEN 'Case 1'
   WHEN 2/0 = 99 THEN 'Case 2'
 END
FROM dual;

MySQL 無法進行相同的測試,因為它返回 NULL 以表示除以零。(SQL 小提琴

引用自:https://dba.stackexchange.com/questions/43352