Sql-Server
SQL Server CASE 語句是否評估所有條件或在第一個 TRUE 條件時退出?
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 小提琴)