2014-03-29 135 views
3

我在SQL(Server 2008)中使用CASE語句時存在一個普遍問題,並且您的WHEN條件中有多個條件爲真,但結果標誌將不同。CASE語句SQL:情況優先?

這是一個假設的例子,但在跨多列應用檢查以對行中的數據進行分類時可能是可轉移的。以下代碼的輸出取決於案件的排序方式,因爲兩者都是正確的。

DECLARE @TESTSTRING varchar(5) 
SET @TESTSTRING = 'hello' 

SELECT CASE 
WHEN @TESTSTRING = 'hello' THEN '0' 
WHEN @TESTSTRING <> 'hi' THEN '1' 
ELSE 'N/A' 
END AS [Output] 

一般來說,以這種方式創建標誌會被認爲是不好的做法嗎? OR WHERE,OR語句會更好嗎?

+0

我一直認爲他們爲了評估它們發生在代碼的順序,但仔細想來,我從來沒有實際驗證過。 – Brandon

+0

從邏輯上說,它是按它編碼的順序排列的。當第一個遇到時,'CASE'將停止,然後第二個然後是其他部分。你測試過了嗎? – CodeBird

+0

-1對此沒有做任何研究。您可以在Microsoft網站上找到所需的信息。 – Kapol

回答

3

確保案例語句按照它們寫入的順序進行評估。使用第一個匹配值。因此,對於您的示例,將返回值0

這在documentation清楚地描述:

CASE搜索表達式:

  • 求值,在指定的邏輯表達式的順序爲每個WHEN子句。
  • 返回計算結果爲TRUE的第一個布爾表達式的result_expression。
  • 如果沒有布爾表達式計算結果爲TRUE,則數據庫引擎在指定ELSE子句時返回else_result_expression,如果未指定ELSE子句,則返回NULL值。

至於這是好還是壞的做法,我會傾向於中立的一面。這是ANSI行爲,所以你可以依靠它,而且在某些情況下,它是非常有用的:

select (case when val < 10 then 'Less than 10' 
      when val < 100 then 'Between 10 and 100' 
      when val < 1000 then 'Between 100 and 1000' 
      else 'More than 1000' -- or NULL 
     end) as MyGroup