1 case函數的類型
case具有兩種格式,簡單case函數和case搜索函數。這兩種方式,大部分情況下可以實現相同的功能。
1.1?簡單case函數語法
case column
when <condition> then value
when <condition> then value
......
else value end;
示例
case sex
when '1' then '男'
when '2' then '女'
else '其他' end;
1.2 case搜索函數語法
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 函數重在簡潔,但是它只適用于這種單字段的單值比較,而case 搜索函數的優點在于適用于所有比較(包括多值比較)的情況。
例如:
CASEWHEN sex = '1' AND age>18 THEN '成年男性'WHEN sex = '2' AND age>18 THEN '成年女性'ELSE '其他' END;
注意:
CASE函數只返回第一個符合條件的值,剩下的CASE部分將會被自動忽略。比如說,下面這段SQL,你case when type in ('a','b') then '第一類' when type in ('a') then '第二類' else '其他類' end永遠無法得到“第二類”這個結果。
2 case行轉列
case用的比較廣泛的功能就是行轉列,就是將記錄行里的數據按條件轉換成具體的列。看如下的一個示例數據:
create table score(name varchar(10),course varchar(10),scott int);
insert into score values (n'張三',n'語文',74);
insert into score values (n'張三',n'數學',83);
insert into score values (n'張三',n'物理',93);
insert into score values (n'李四',n'語文',74);
insert into score values (n'李四',n'數學',84);
insert into score values (n'李四',n'物理',94);
現在我們想實現這樣的功能,就是將各學科作為單獨的列來顯示各個學生各科的成績。我們可以對課程里的記錄做如下的行列轉換:
select name, max(case course when '語文' then scott else 0 end) 語文, max(case course when '數學' then scott else 0 end) 數學,max(case course when '物理' then scott else 0 end) 物理
from score
group by name;
結果:
3 piovt函數行轉列
如果要實現等同上面的結果:
select * from
score pivot( max(scott) for course in ('語文','數學','物理')) a;
結果:
其中:
for后面的是我們即將進行行轉列的列部分
in里面的是我們行轉列之后的列
max是聚合IN里面的內容,也可以是其他聚合函數:SUM,MIN,COUNT等
piovt寫法比較固定,是case when的一種簡略寫法。
4 批注
case是我們在日常工作中使用非常頻繁的一個功能,可以很好的將我們需要的數據單獨的顯示在一列里面,有助于對數據有個比較清晰的掌握