?SQL 中 CASE 表達(dá)式的使用方式
1. 前言
CASE 表達(dá)式是從 SQL-92 標(biāo)準(zhǔn)開(kāi)始被引入的。
在 CASE 表達(dá)式里,可以使用 BETWEEN 、LIKE和 < 、> 等便利的謂詞組合,以及能嵌套子查詢的 IN 和 EXISTS 謂詞。
2. 語(yǔ)法
CASE 表達(dá)式有 簡(jiǎn)單 CASE 表達(dá)式(simple case expression) 和 搜索 CASE 表達(dá)式(searched case expression) 兩種寫法:
-- 簡(jiǎn)單CASE 表達(dá)式
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他'END
-- 搜索CASE 表達(dá)式
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' ENDsex 列(字段)如果是 '1' ,那么結(jié)果為男;如果是 '2' ,那么結(jié)果為女。
3. 注意點(diǎn)
CASE在匹配給定條件時(shí),發(fā)現(xiàn)為真的 WHEN 子句時(shí),CASE 表達(dá)式的真假值判斷就會(huì)中止,而剩余的 WHEN 子句會(huì)被忽略。為了避免引起不必要的混亂,使用 WHEN 子句時(shí)要注意條件的排他性。
-- 例如,這樣寫的話,結(jié)果里不會(huì)出現(xiàn)“第二”
CASE WHEN col_1 IN ('a', 'b') THEN '第一'
WHEN col_1 IN ('a') THEN '第二'
ELSE '其他' END- 統(tǒng)一各分支返回的數(shù)據(jù)類型: 一定要注意 CASE 表達(dá)式里各個(gè)分支返回的數(shù)據(jù)類型是否一致。某個(gè)分支返回字符型,而其他分支返回?cái)?shù)值型的寫法是不正確的。
- 不要忘了寫 END: 不寫END是語(yǔ)法錯(cuò)誤,這是不允許的。
- 養(yǎng)成寫 ELSE 子句的習(xí)慣: 與 END 不同,ELSE 子句是可選的,不寫也不會(huì)出錯(cuò)。不寫 ELSE 子句時(shí),CASE 表達(dá)式的執(zhí)行結(jié)果是 NULL 。
4. 分類匯總數(shù)據(jù)

SELECT
CASE pref_name
WHEN '德島' THEN '四國(guó)'
WHEN '香川' THEN '四國(guó)'
WHEN '愛(ài)媛' THEN '四國(guó)'
WHEN '高知' THEN '四國(guó)'
WHEN '福岡' THEN '九州'
WHEN '佐賀' THEN '九州'
WHEN '長(zhǎng)崎' THEN '九州'
END AS district,
SUM(population) AS total
FROM poptbl
GROUP BY
CASE pref_name
WHEN '德島' THEN '四國(guó)'
WHEN '香川' THEN '四國(guó)'
WHEN '愛(ài)媛' THEN '四國(guó)'
WHEN '高知' THEN '四國(guó)'
WHEN '福岡' THEN '九州'
WHEN '佐賀' THEN '九州'
WHEN '長(zhǎng)崎' THEN '九州'
END;5. 一條SQL實(shí)現(xiàn)不同條件的統(tǒng)計(jì)

SELECT
pref_name AS '縣名',
SUM( CASE WHEN sex=1 THEN population ELSE 0 END ) AS '男'
SUM( CASE WHEN sex=2 THEN population ELSE 0 END ) AS '女'
FROM poptlb
GROUP By pref_name6. 使用CHECK約束定義多個(gè)列的條件關(guān)系
假設(shè)某公司規(guī)定“女性員工的工資必須在 20 萬(wàn)日元以下”,而在這個(gè)公司的人事表中,這條無(wú)理的規(guī)定是使用 CHECK 約束來(lái)描述的,代碼如下所示:
CONSTRAINT check_salary CHECK (
CASE WHEN sex = '2' THEN
CASE WHEN salary <= 200000
THEN 1 ELSE 0 END
ELSE 1 END = 1
)7. 在UPDATE語(yǔ)句中進(jìn)行條件分支

條件:
- 對(duì)當(dāng)前工資為 30 萬(wàn)日元以上的員工,降薪 10%。
- 對(duì)當(dāng)前工資為 25 萬(wàn)日元以上且不滿 28 萬(wàn)日元的員工,加薪 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;8. 生成交叉表



--- 使用IN謂詞
SELECT
course_name AS '課程名',
CASE WHEN courese_id IN (SELECT course_id FROM open_course WHERE mouth = '200706')
THEN 'o'
ELSE 'x'
END AS '6 月'
CASE WHEN courese_id IN (SELECT course_id FROM open_course WHERE mouth = '200707')
THEN 'o'
ELSE 'x'
END AS '7 月'
CASE WHEN courese_id IN (SELECT course_id FROM open_course WHERE mouth = '200708')
THEN 'o'
ELSE 'x'
END AS '8 月'
FROM course_master;
--- 或者使用EXIST謂詞
SELECT CM.course_name,
CASE WHEN EXISTS (SELECT course_id FROM OpenCourses OC WHERE month = 200706 AND OC.course_id = CM.course_id)
THEN '○' ELSE '×'
END AS "6 月",
CASE WHEN EXISTS (SELECT course_id FROM OpenCourses OC WHERE month = 200707 AND OC.course_id = CM.course_id)
THEN '○' ELSE '×'
END AS "7 月",
CASE WHEN EXISTS (SELECT course_id FROM OpenCourses OC WHERE month = 200708 AND OC.course_id = CM.course_id)
THEN '○' ELSE '×'
END AS "8 月"
FROM CourseMaster CM;9. CASE表達(dá)式中使用聚合函數(shù)

對(duì)于加入了多個(gè)社團(tuán)的學(xué)生,通過(guò)將其“主社團(tuán)標(biāo)志”列設(shè)置為 Y 或者 N 來(lái)表明哪一個(gè)社團(tuán)是他的主社團(tuán);對(duì)于只加入了一個(gè)社團(tuán)的學(xué)生,將其“主社團(tuán)標(biāo)志”列設(shè)置為 N。
現(xiàn)需要查詢出所有學(xué)生加入的社團(tuán),若加入了多個(gè)則顯示主社團(tuán)
SELECT
std_id,
CASE WHEN COUNT(*)==1 THEN MAX(club_id)
ELSE MAX(CASE WHEN main_club_flg = 'Y' THEN club_id ELSE NULL END)
END AS 'main_club'
FROM student_club
GROUP BY std_id10. 按照自定義規(guī)則排序列

按照mark列排序,要求修正a b c d 的權(quán)重為 c b a d
SELECT
mark
FROM
sort_test
ORDER BY
CASE mark
WHEN 'a' THEN -1
WHEN 'b' THEN 1
WHEN 'c' THEN 2
WHEN 'd' THEN -2
END 到此這篇關(guān)于 SQL 中 CASE 表達(dá)式的使用方式的文章就介紹到這了,更多相關(guān) SQL CASE 表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql中distinct和group?by的區(qū)別淺析
distinct簡(jiǎn)單來(lái)說(shuō)就是用來(lái)去重的,而group by的設(shè)計(jì)目的則是用來(lái)聚合統(tǒng)計(jì)的,兩者在能夠?qū)崿F(xiàn)的功能上有些相同之處,但應(yīng)該仔細(xì)區(qū)分,下面這篇文章主要給大家介紹了關(guān)于mysql中distinct和group?by區(qū)別的相關(guān)資料,需要的朋友可以參考下2023-05-05
SQL查詢之字段是逗號(hào)分隔開(kāi)的數(shù)組如何查詢匹配數(shù)據(jù)問(wèn)題
這篇文章主要介紹了SQL查詢之字段是逗號(hào)分隔開(kāi)的數(shù)組如何查詢匹配數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
解決mysql不能插入中文Incorrect string value
首先我的配置文件的設(shè)置的默認(rèn)字符集是utf8即2009-05-05
MySQL數(shù)據(jù)庫(kù)innodb啟動(dòng)失敗無(wú)法重啟的解決方法
這篇文章給大家分享了MySQL數(shù)據(jù)庫(kù)innodb啟動(dòng)失敗無(wú)法重啟的解決方法,通過(guò)總結(jié)自己遇到的問(wèn)題分享給大家,讓遇到同樣問(wèn)題的朋友們可以盡快解決,下面來(lái)一起看看吧。2016-09-09
Mysql用戶創(chuàng)建以及權(quán)限賦予操作的實(shí)現(xiàn)
在MySQL中,創(chuàng)建新用戶并為其授予權(quán)限是一項(xiàng)常見(jiàn)的操作,本文主要介紹了Mysql用戶創(chuàng)建以及權(quán)限賦予操作的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
MySQL存儲(chǔ)引擎MyISAM與InnoDB區(qū)別總結(jié)整理
今天小編就為大家分享一篇關(guān)于MySQL存儲(chǔ)引擎MyISAM與InnoDB區(qū)別總結(jié)整理,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03

