1.CASE 具有兩種格式,簡(jiǎn)單 CASE 函數(shù)和 CASE 搜索函數(shù)。
2. 簡(jiǎn)單 CASE 函數(shù)
語(yǔ)法
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ù)
語(yǔ)法
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
簡(jiǎn)單 CASE 函數(shù)重在簡(jiǎn)潔,但是它只適用于這種單字段的單值比較
CASE 搜索函數(shù)的優(yōu)點(diǎn)在于適用于所有比較(包括多值比較)的情況。
例如
CASE WHEN sex = '1' AND age>18 THEN '成年男性'
WHEN sex = '2' AND age>18 THEN '成年女性'
ELSE '其他' END
注意:CASE 函數(shù)只返回第一個(gè)符合條件的值,剩下的 CASE 部分將會(huì)被自動(dòng)忽略。
比如說(shuō),下面這段 SQL,你永遠(yuǎn)無(wú)法得到“第二類”這個(gè)結(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)換成具體
的列。 看如下的一個(gè)示例:

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

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