不管哪一種語言都具備流程控制的功能,用來控制程式執行與流程的流向,透過流程控制可以讓程式更容易維護。
這次要討論根據特定條件來執行不同流程的指令:CASE...WHEN,它可說是 IF...ELSE 的改良版。
使用 IF...ELSE 的缺點就是當條件一多時,程式碼看去就不容易懂,維護起來也不方便。所以 SQL Server 特別提供了另外一個簡單的指令:CASE...WHEN。
這個範例是將代表性別與婚姻代碼的欄位,轉換成大家看的懂得文字描述:
USE AdventureWorks
GO
SELECT 員工編號 = EmployeeID,
性別 = CASE Gender
WHEN 'M' THEN N'男'
WHEN 'F' THEN N'女'
END,
婚姻 = CASE MaritalStatus
WHEN 'S' THEN N'單身'
WHEN 'M' THEN N'已婚'
END
FROM HumanResources.Employee
執行的部分結果如下:
上面的那段程式碼可以改寫成下面這樣:
USE AdventureWorks
GO
SELECT 員工編號 = EmployeeID,
性別 = CASE Gender
WHEN 'M' THEN N'男'
ELSE N'女'
END,
婚姻 = CASE MaritalStatus
WHEN 'S' THEN N'單身'
ELSE N'已婚'
END
FROM HumanResources.Employee
上面這兩個程式碼的差別在於第一個是使用了兩個 WHEN 子句,而第二個則是使用一個 WHEN 子句與一個 ELSE 子句。
現在我們使用 CASE 函式的另外一種寫法來改寫上面的兩個程式碼:
USE AdventureWorks
GO
SELECT 員工編號 = EmployeeID,
性別 = CASE
WHEN (Gender = 'M') THEN N'男'
WHEN (Gender = 'F') THEN N'女'
END,
婚姻 = CASE
WHEN (MaritalStatus = 'S') THEN N'單身'
WHEN (MaritalStatus = 'M') THEN N'已婚'
END
FROM HumanResources.Employee
USE AdventureWorks
GO
SELECT 員工編號 = EmployeeID,
性別 = CASE
WHEN (Gender = 'M') THEN N'男'
ELSE N'女'
END,
婚姻 = CASE
WHEN (MaritalStatus = 'S') THEN N'單身'
ELSE N'已婚'
END
FROM HumanResources.Employee
由於執行的結果也是一樣,就不再貼圖了。只是大家看得出來這四個程式碼之間的差異嗎?
前兩個程式碼是在 CASE 函數之後,用欄位名稱當作條件,然後再檢查欄位中的資料的值。而倒數第兩個程式碼則是檢查 WHEN 子句的條件是否成立,最後一個程式碼則是先檢查 WHEN 子句有沒有成立,如果沒有成立就傳回 ELSE 子句的結果。
就 SQL Server 2005 線上叢書的說法,前兩個程式碼是所謂的**「簡單的 CASE 功能」,它會將運算式與一組簡單的運算式比對,以判斷其結果。而最後兩個程式碼是所謂的「搜尋的 CASE 功能」**,它會評估一組布林運算式來判斷其結果。相信大家有看,也是沒有懂啦!
不過在看過這四個程式碼,再加上下面那張比較圖,自己比較看看,相信聰明的邦友,都很厲害、看的懂。
由圖中,我們可以看出來左邊那個會針對 Gender 與 MaritalStatus 進行「單一值的比較」,而右邊那個則是進行「多種條件的判斷」。
請問一下,上面那一張圖做的不錯,不知道是用什麼軟體製作的?
用 PowerPoint 2007,然後再使用另存新檔的方式,把某一張簡報存成圖檔