使用 IF...ELSE 的缺點就是當條件一多時,程式碼看去就不容易懂,維護起來也不方便。所以 SQL Server 特別提供了另外一個簡單的指令:CASE...WHEN。51Testing软件测试网(?7D x*wZ(r b}
4Em#v;u5~(vE0這個範例是將代表性別與婚姻代碼的欄位,轉換成大家看的懂得文字描述:51Testing软件测试网%rP(A6j2g#u{
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
&L @iUYfj|0L|:`6P;o5Fh0執行的部分結果如下:
51Testing软件测试网5pJ7y_|p'\JC5I2G~DV&W!?051Testing软件测试网&Zb2k9x|_+P&xsn上面的那段程式碼可以改寫成下面這樣:
51Testing软件测试网M#g.b?:l8CAQUSE 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
YlY1SxD?%J051Testing软件测试网[Noo8h5u上面這兩個程式碼的差別在於第一個是使用了兩個 WHEN 子句,而第二個則是使用一個 WHEN 子句與一個 ELSE 子句。
51Testing软件测试网'u
F_Hy,B#M
i,f/X
?6J51Testing软件测试网c0k,ao2{n
@+`)q現在我們使用 CASE 函式的另外一種寫法來改寫上面的兩個程式碼:
51Testing软件测试网2y6@'g0}$yE-zUSE 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
51Testing软件测试网9~0c1k;Ii2vk51Testing软件测试网b\1T&p
cu^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
51Testing软件测试网3AbWFK6[51Testing软件测试网5I;[x+l1|8G P$K|由於執行的結果也是一樣,就不再貼圖了。只是大家看得出來這四個程式碼之間的差異嗎?
6N5sT;Wf.Y0v]ZX3f0前兩個程式碼是在 CASE 函數之後,用欄位名稱當作條件,然後再檢查欄位中的資料的值。而倒數第兩個程式碼則是檢查 WHEN 子句的條件是否成立,最後一個程式碼則是先檢查 WHEN 子句有沒有成立,如果沒有成立就傳回 ELSE 子句的結果。
[+Dg3Ig\7`0Uv
g6t/hx:I P3P6M2t0就 SQL Server 2005 線上叢書的說法,前兩個程式碼是所謂的
「簡單的 CASE 功能」,它會將運算式與一組簡單的運算式比對,以判斷其結果。而最後兩個程式碼是所謂的
「搜尋的 CASE 功能」,它會評估一組布林運算式來判斷其結果。相信大家有看,也是沒有懂啦!
)KXNx*aNrk;yE01aFn|t/p0不過在看過這四個程式碼,再加上下面那張比較圖,自己比較看看,相信聰明的邦友,都很厲害、看的懂。
51Testing软件测试网hNKX%wi R7Fk2LeZg2}*fo4q0kd'Y8Z[&MGz05q$so
~G e]0由圖中,我們可以看出來左邊那個會針對 Gender 與 MaritalStatus 進行「單一值的比較」,而右邊那個則是進行「多種條件的判斷」。