CASE簡介
基於列的邏輯表達式,其實就是CASE表達式.可以用在SELECT,UPDATE,DELETE,SET以及IN,WHERE,ORDER BY和HAVING子句之后。由於這里講的是T-SQL查詢,所以只說到CASE表達式在SELECT子句和ORDER BY子句中的使用。
CASE表達式的作用與編程語言中的IF…THEN…ELSE邏輯類似。只是CASE表達式在T-SQL中並不能控制T-SQL程序的流程,只是作為基於列的邏輯使用。
一個簡單的示例,假設有這樣一張表:
在查詢的時候,對於列Sex,如果是False就顯示男,如果是True就顯示女。
語句如下:
SELECT Id,Name, CASE Sex WHEN 0 THEN '男' WHEN 1 THEN '女' ELSE '不清楚' END AS 性別 FROM PERSON
顯示結果如下:
CASE表達式實際情況可以分為兩種:
- CASE簡單表達式(CASE Simple Expression):將某個表達式與一組簡單表達式進行比較以確定結果。
- CASE 搜索表達式(CASE Searched Expression):計算一組布爾表達式以確定結果。
下面分別介紹這兩種方式。
CASE簡單表達式
在CASE簡單表達式中,整個表達式只會取一列的值做相應的判斷。就如同上面的例子一樣,現在只給出另外一種等價的寫法。
SELECT Id,Name, 性別 = CASE Sex --區別僅僅是將別名放到這里而已 WHEN 0 THEN '男' WHEN 1 THEN '女' ELSE '不清楚' END FROM PERSON
因為CASE表達式的值只局限在一列當中,所以THEN后面的值數據類型必須相同,或者兼容,否則就會報錯。
在上面語句中,還有一個可選的“ELSE”語句,這個語句可以省略,但最好的做法是保留ELSE,否則不在匹配值范圍內的所有值都會為“NULL”。
CASE搜索表達式
與CASE簡單表達式不同,CASE搜索表達式提供了更強大的功能,CASE搜索表達式不僅可以使用更復雜的邏輯表達式,而且還能夠根據多個列的數據確定所顯示列的值。
那么如何根據列來確定顯示值呢,且看下面例子:
SELECT Id,Name, 性別 = CASE --注意這里的CASE后面不跟任何東西了 WHEN Sex=0 THEN '帥哥' --當然Sex你可以換成任意其他列 WHEN Sex=1 THEN '美女' ELSE '不清楚' END FROM PERSON
顯示結果如下:
現在來做一個根據多個列判斷顯示的例子,在原來的表上添加兩條記錄
多個列組合判斷:
現在要根據Id和Sex兩個列來組合判斷帥哥,美女的SQL如下:
SELECT Id,Name, CASE WHEN Id = 3 AND Sex = 0 THEN '帥哥' --這里要注意順序,優先顯示前面匹配到的,這個后面會提到 WHEN Id = 4 And Sex = 1 THEN '美女' WHEN Sex = 0 THEN '男' WHEN Sex = 1 THEN '女' ELSE '不清楚' END AS 性別 FROM Person
顯示結果如下:
范圍判斷:
再新建一個表如下所示:
這里要實現的效果是,當分數大於90,顯示優秀,大於80,顯示良好...
SQL語句如下:
SELECT Id,Name, CASE WHEN Score > 90 THEN '優秀' WHEN Score > 80 THEN '良好' WHEN Score > 70 THEN '中等' WHEN Score > 60 THEN '及格' ELSE '不及格' END AS 分數 FROM Score
查詢結果如下:
這里要注意WHEN…THEN是以先后順序出現,當第一個WHEN后面的表達式為FALSE時,則會去看第二個WHEN后的表達式,依次類推。當第一個WHEN后的表達式為TRUE時,則取第一個THEN后面的值,即使第二個WHEN表達式也為TRUE。所以這里為什么劉備分數滿足前面幾個條件,也顯示第一個結果。
CASE表達式在ORDER BY中的使用
CASE表達式在ORDER BY中可以將排序結果分類,可以使符合一定條件則升序,符合另外一定條件則降序,但總體差不多,下面給個例子。
還是剛才那張表,我想,當性別為男則Id降序排序,如果性別為女則Id升序排序。SQL語句如下:
SELECT Id,Name,Sex FROM Person ORDER BY CASE WHEN Sex=0 THEN Id END DESC, --性別為男,Id降序 CASE WHEN Sex=1 THEN Id END ASC --性別為女,Id升序
顯示結果如下: