T-SQL 基於列的邏輯表達式 (CASE)


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升序

  顯示結果如下:

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM