在發(fā)現(xiàn)結(jié)果為真的WHEN子句時(shí),CASE表達(dá)式的真假值判斷會(huì)終止,剩余的WHEN子句會(huì)被忽略:
CASE WHEN col_1 IN ('a', 'b') THEN '第一'
WHEN col_1 IN ('a') THEN '第二'
ELSE '其他' END
注意:
- 統(tǒng)一各分支返回的數(shù)據(jù)類型.
- 記得寫end.
- 寫else子句的習(xí)慣,否則執(zhí)行結(jié)果默認(rèn)處理為null.
案例1
將已有編號(hào)方式轉(zhuǎn)換為新的方式并統(tǒng)計(jì)
下面給出的group by引用select中定義的別名,case寫在group by違反SQL規(guī)則(GROUP BY 子句比 SELECT 語句先執(zhí)行):
SELECT CASE pref_name
WHEN '德島' THEN '四國'
WHEN '香川' THEN '四國'
WHEN '愛媛' THEN '四國'
WHEN '高知' THEN '四國'
WHEN '福岡' THEN '九州'
WHEN '佐賀' THEN '九州'
WHEN '長崎' THEN '九州'
ELSE '其他' END AS district,
SUM(population)
FROM PopTbl
GROUP BY district;
案例2
用一條 SQL 語句進(jìn)行不同條件的統(tǒng)計(jì)
SELECT pref_name,
SUM( CASE WHEN sex = '1' THEN population ELSE 0 END) AS cnt_m,
SUM( CASE WHEN sex = '2' THEN population ELSE 0 END) AS cnt_f
FROM PopTbl2
GROUP BY pref_name;
總結(jié):聚合函數(shù)可以實(shí)現(xiàn)行轉(zhuǎn)列,實(shí)現(xiàn)select的條件分支(代替where)
案例3
用 CHECK 約束定義多個(gè)列的條件關(guān)系
題目:女性員工工資必須在20w以上(蘊(yùn)含式(conditional)的邏輯表達(dá)式,記作 P → Q)
CONSTRAINT check_salary CHECK
( CASE WHEN sex = '2'
THEN CASE WHEN salary > 200000
THEN 1 ELSE 0 END
ELSE 1 END = 1 )
案例4
在 UPDATE 語句里進(jìn)行條件分支
要求
- 對(duì)當(dāng)前工資為 30 萬以上的員工,降薪 10%。
- 對(duì)當(dāng)前工資為 25 萬以上且不滿 28 萬的員工,加薪 20%。
UPDATE Salaries
SET salary = CASE WHEN salary >= 300000
THEN salary * 0.9
WHEN salary >= 250000 AND salary < 280000
THEN salary * 1.2
ELSE salary END;
案例5
表之間的數(shù)據(jù)匹配
用以上表生成下面表:
課程名稱 | 6 月 | 7 月 | 8 月 |
---|---|---|---|
會(huì)計(jì)入門 | ○ | × | × |
財(cái)務(wù)知識(shí) | × | × | ○ |
簿記考試 | ○ | × | × |
稅務(wù)師 | ○ | ○ | ○ |
注:此sql實(shí)現(xiàn)可以使用in或exists謂詞
SELECT course_name,
CASE WHEN course_id IN
(SELECT course_id FROM OpenCourses
WHERE month = 200706) THEN '○'
ELSE '×' END AS "6 月",
CASE WHEN course_id IN
(SELECT course_id FROM OpenCourses
WHERE month = 200707) THEN '○'
ELSE '×' END AS "7 月",
CASE WHEN course_id IN
(SELECT course_id FROM OpenCourses
WHERE month = 200708) THEN '○'
ELSE '×' END AS "8 月"
FROM CourseMaster;
案例6
在 CASE 表達(dá)式中使用聚合函數(shù)
- 獲取只加入了一個(gè)社團(tuán)的學(xué)生的社團(tuán) ID。
- 獲取加入了多個(gè)社團(tuán)的學(xué)生的主社團(tuán) ID。
注:此處使用MAX,確保每個(gè)學(xué)生只被計(jì)算一次,確保在每個(gè)分組(每個(gè)學(xué)生)中只選擇一個(gè)社團(tuán).
SELECT std_id,
CASE WHEN COUNT(*) = 1 -- 只加入了一個(gè)社團(tuán)的學(xué)生
THEN MAX(club_id)
ELSE MAX(CASE WHEN main_club_flg = 'Y'
THEN club_id
ELSE NULL END)
END AS main_club
FROM StudentClub
GROUP BY std_id;
case在執(zhí)行時(shí)會(huì)被判斷為一個(gè)固定值,因此可以用在聚合函數(shù)中.
習(xí)題實(shí)踐 求兩列中最大值
select key,
case when x < y then y
else x end as greatest
from Greatests;
拓展為三列,需要在分支中嵌套(case表達(dá)式在執(zhí)行時(shí)會(huì)解析為標(biāo)量值):
select key,
case when case when x < y then y else x end < z
then z
else case when x < y then y else x end
end as greatest
from Greatests;
如果為四列或者五列,先行轉(zhuǎn)列之后使用max函數(shù):
select key,MAX(col) as greatest
from (
select key,x as col from Greatests
union all
select key,y as col from Greatests
unoin all
select key,z as col from Greate
)TMP
group by key;
其中上述使用union all產(chǎn)生重復(fù)數(shù)據(jù)(建立臨時(shí)表進(jìn)行行轉(zhuǎn)列),之后使用group by進(jìn)行排序,最后max進(jìn)行去重.文章來源:http://www.zghlxwxcb.cn/news/detail-855257.html
注:Oracle 或 MySQL 可以使用下面函數(shù)進(jìn)行求解:文章來源地址http://www.zghlxwxcb.cn/news/detail-855257.html
SELECT key, GREATEST(GREATEST(x,y), z) AS greatest
FROM Greatests;
到了這里,關(guān)于Case表達(dá)式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!