1.CASE 具有兩種格式,簡單 CASE 函數(shù)和 CASE 搜索函數(shù)。
2. 簡單 CASE 函數(shù)
語法
CASE column
WHEN <condition> THEN value
WHEN <condition> THEN value
......
ELSE value END
示例
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
3.CASE 搜索函數(shù)
語法
CASE
WHEN <condition> [,<condition>] THEN value
WHEN <condition> [,<condition>] THEN value
......
ELSE value END
示例
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
簡單 CASE 函數(shù)重在簡潔,但是它只適用于這種單字段的單值比較
CASE 搜索函數(shù)的優(yōu)點在于適用于所有比較(包括多值比較)的情況。
例如
CASE WHEN sex = '1' AND age>18 THEN '成年男性'
WHEN sex = '2' AND age>18 THEN '成年女性'
ELSE '其他' END
注意:CASE 函數(shù)只返回第一個符合條件的值,剩下的 CASE 部分將會被自動忽略。
比如說,下面這段 SQL,你永遠無法得到“第二類”這個結(jié)果
CASE WHEN Type IN ('a','b') THEN '第一類'
WHEN Type IN ('a') THEN '第二類'
ELSE '其他類' END
4.CASE 行轉(zhuǎn)列
CASE 用的比較廣泛的功能就是行轉(zhuǎn)列,就是將記錄行里的數(shù)據(jù)按條件轉(zhuǎn)換成具體
的列。 看如下的一個示例:

現(xiàn)在我們想實現(xiàn)這樣的功能,就是將各學(xué)科作為單獨的列來顯示各個學(xué)生各科的成
績。我們可以對課程里的記錄做如下的行列轉(zhuǎn)換:
SELECT 姓名,
MAX(CASE 課程 WHEN N'語文' THEN 分數(shù) ELSE 0 END) 語文,
MAX(CASE 課程 WHEN N'數(shù)學(xué)' THEN 分數(shù) ELSE 0 END) 數(shù)學(xué),
MAX(CASE 課程 WHEN N'物理' THEN 分數(shù) ELSE 0 END) 物理
FROM Score
GROUP BY 姓名
執(zhí)行結(jié)果如下:

5. 行轉(zhuǎn)列新方法
這樣就很好的完成了行列的轉(zhuǎn)換了,當(dāng)然這只是一個比較簡單的例子,SQL Server 2005 版
之后有單獨的行列轉(zhuǎn)換功能 PIOVT,以下查詢同樣可以得到上面的結(jié)果:
SELECT * FROM Score
PIVOT( MAX(分數(shù)) FOR 課程 IN (語文,數(shù)學(xué),物理)) A
其中 FOR 后面的是我們即將進行行轉(zhuǎn)列的列部分
IN 里面的是我們行轉(zhuǎn)列之后的列
MAX 是聚合 IN 里面的內(nèi)容,也可以是其他聚合函數(shù):SUM,MIN,COUNT 等
PIVOT 寫法比較固定,是 CASE WHEN 的一種簡略寫法。