国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Case表達(dá)式

這篇具有很好參考價(jià)值的文章主要介紹了Case表達(dá)式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在發(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

注意:

  1. 統(tǒng)一各分支返回的數(shù)據(jù)類型.
  2. 記得寫end.
  3. 寫else子句的習(xí)慣,否則執(zhí)行結(jié)果默認(rèn)處理為null.

案例1

將已有編號(hào)方式轉(zhuǎn)換為新的方式并統(tǒng)計(jì)
Case表達(dá)式

下面給出的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ì)
Case表達(dá)式

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)行條件分支
Case表達(dá)式

要求

  1. 對(duì)當(dāng)前工資為 30 萬以上的員工,降薪 10%。
  2. 對(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ù)匹配
Case表達(dá)式

用以上表生成下面表:

課程名稱 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ù)
Case表達(dá)式

  1. 獲取只加入了一個(gè)社團(tuán)的學(xué)生的社團(tuán) ID。
  2. 獲取加入了多個(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)行去重.

注: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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包