天天看點

CASE表達式

  CASE表達式是一個标量表達式,它基于條件邏輯來傳回一個值。注意,CASE是一個表達式,而不是一條語句;也就是會所,不能用它來控制活動的流程,也不能根據條件邏輯來做某些處理。相反,它隻是根據條件邏輯來傳回某個值。因為CASE是一個标量表達式,是以它可以支援任何标量表達式(如SELECT、WHERE、HAVING,以及ORDER BY子句)、CHECK限制,等等。

  CASE表達式有兩種格式:簡單表達式和搜尋表達式。CASE簡單格式将一個值(或一個标量表達式)與一組可能的取值進行比較,并傳回第一個比對的結果。如果清單中沒有值等于測試值,CASE表達式就傳回其ELSE子句(如果存在)中列出的值。如果CASE表達式中沒有ELSE子句,則預設将其視為ELSE NULL。

  例如,以下對Production.Products表的查詢就在SELECT子句中使用了CASE表達式,以生成用于描述categoryid列取值的資訊:

1 SELECT productid,productname,categoryid,

2 CASE categoryid

3 WHEN1THEN'Beverages'

4 WHEN2THEN'Condiments'

5 WHEN3THEN'Confections'

6 WHEN4THEN'Dairy Products'

7 WHEN5THEN'Grains/Cereals'

8 WHEN6THEN'Meat/Poultry'

9 WHEN7THEN'Produce'

10 WHEN8THEN'Seafood'

11 ELSE'Unknown Category'

12 ENDAS categoryname

13  FROM Production.Products;

  該查詢生成以下輸出:

CASE表達式

  這個查詢是使用CASE表達式的一個簡單例子。除非商品種類的數量非常少,而且也是靜态的,否則最好的設計選擇可能是應該在另一個單獨的表中來維護商品種類;當需要擷取種類描述時,把那個表和Products進行連結(join)操作。

  作為CASE簡單表達式的另一個示範,以下對Sales.OrderValues視圖的查詢先根據val的邏輯順序生成3個組,再把組的編号翻譯成組的描述資訊(Low、Medium,以及High):

1 SELECT orderid,custid,val,

2 CASE NTILE(3) OVER(ORDERBY val)

3 WHEN1THEN'Low'

4 WHEN2THEN'Medium'

5 WHEN3THEN'High'

6 ELSE'Unknown'

7 ENDAS titledesc

8  FROM Sales.OrderValues

9  ORDERBY val;

  該查詢會輸出以下輸出:

CASE表達式

  CASE簡單表達式隻有一個測試值(或表達式),它緊跟在CASE關鍵字後面,與WHEN子句中的一組可能值進行比較。CASE搜尋表達式要更靈活些,它可以在WHEN子句中指定謂詞或邏輯表達式,而不限于隻進行相等性比較。CASE搜尋表達式傳回結果為TRUE的第一個WHEN邏輯表達式所關聯的THEN子句中指定的值。如果沒有任何WHEN表達式結果為TRUE,CASE表達式就傳回ELSE子句中出現的值(如果沒有指定ELSE子句,則傳回NULL)。例如,以下查詢根據商品的價格是否小于1000.00、在1000.00到3000.00之間、或者大于3000.00而生成相應的價格描述:

2 CASE

3 WHEN val <1000.00THEN'Less then 1000'

4 WHEN val BETWEEN1000.00AND3000.00THEN'Between 1000 and 3000'

5 WHEN val >3000.00THEN'More than 3000'

7 ENDAS valuecategory

8  FROM Sales.OrderValues;

  該查詢會生成以下輸出:

CASE表達式

  可以看到,每個CASE簡單表達式都可以轉換成CASE搜尋表達式,但并非所有情況都有必要使用CASE搜尋表達式。