添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

不管哪一種語言都具備流程控制的功能,用來控制程式執行與流程的流向,透過流程控制可以讓程式更容易維護。
這次要討論根據特定條件來執行不同流程的指令:CASE...WHEN,它可說是 IF...ELSE 的改良版。
使用 IF...ELSE 的缺點就是當條件一多時,程式碼看去就不容易懂,維護起來也不方便。所以 SQL Server 特別提供了另外一個簡單的指令:CASE...WHEN。

這個範例是將代表性別與婚姻代碼的欄位,轉換成大家看的懂得文字描述:

USE AdventureWorks
SELECT 員工編號 = EmployeeID,
	性別 = CASE Gender
			WHEN 'M' THEN N'男'
			WHEN 'F' THEN N'女'
	婚姻 = CASE MaritalStatus
			WHEN 'S' THEN N'單身'
			WHEN 'M' THEN N'已婚'
FROM HumanResources.Employee

執行的部分結果如下:

上面的那段程式碼可以改寫成下面這樣:

USE AdventureWorks
SELECT 員工編號 = EmployeeID,
	性別 = CASE Gender
			WHEN 'M' THEN N'男'
			ELSE N'女'
	婚姻 = CASE MaritalStatus
			WHEN 'S' THEN N'單身'
			ELSE N'已婚'
FROM HumanResources.Employee

上面這兩個程式碼的差別在於第一個是使用了兩個 WHEN 子句,而第二個則是使用一個 WHEN 子句與一個 ELSE 子句。

現在我們使用 CASE 函式的另外一種寫法來改寫上面的兩個程式碼:

USE AdventureWorks
SELECT 員工編號 = EmployeeID,
	性別 = CASE
			WHEN (Gender = 'M') THEN N'男'
			WHEN (Gender = 'F') THEN N'女'
	婚姻 = CASE 
			WHEN (MaritalStatus = 'S') THEN N'單身'
			WHEN (MaritalStatus = 'M') THEN N'已婚'
FROM HumanResources.Employee

由於執行的結果也是一樣,就不再貼圖了。只是大家看得出來這四個程式碼之間的差異嗎?

前兩個程式碼是在 CASE 函數之後,用欄位名稱當作條件,然後再檢查欄位中的資料的值。而倒數第兩個程式碼則是檢查 WHEN 子句的條件是否成立,最後一個程式碼則是先檢查 WHEN 子句有沒有成立,如果沒有成立就傳回 ELSE 子句的結果。

就 SQL Server 2005 線上叢書的說法,前兩個程式碼是所謂的**「簡單的 CASE 功能」,它會將運算式與一組簡單的運算式比對,以判斷其結果。而最後兩個程式碼是所謂的「搜尋的 CASE 功能」**,它會評估一組布林運算式來判斷其結果。相信大家有看,也是沒有懂啦!

不過在看過這四個程式碼,再加上下面那張比較圖,自己比較看看,相信聰明的邦友,都很厲害、看的懂。

由圖中,我們可以看出來左邊那個會針對 Gender 與 MaritalStatus 進行「單一值的比較」,而右邊那個則是進行「多種條件的判斷」。