Case鍏鋒湁涓ょ鏍煎紡銆傜畝鍗旵ase鍑芥暟鍜孋ase鎼滅儲鍑芥暟銆?
--綆鍗旵ase鍑芥暟
CASE sex
WHEN '1' THEN '鐢?
WHEN '2' THEN '濂?
ELSE '鍏朵粬' END
--Case鎼滅儲鍑芥暟
CASE WHEN sex = '1' THEN '鐢?
WHEN sex = '2' THEN '濂?
ELSE '鍏朵粬' END
榪欎袱縐嶆柟寮忥紝鍙互瀹炵幇鐩稿悓鐨勫姛鑳姐傜畝鍗旵ase鍑芥暟鐨勫啓娉曠浉瀵規瘮杈冪畝媧侊紝浣嗘槸鍜孋ase鎼滅儲鍑芥暟鐩告瘮錛屽姛鑳芥柟闈細鏈変簺闄愬埗錛屾瘮濡傚啓鍒ゆ柇寮忋?
榪樻湁涓涓渶瑕佹敞鎰忕殑闂錛孋ase鍑芥暟鍙繑鍥炵涓涓鍚堟潯浠剁殑鍊鹼紝鍓╀笅鐨凜ase閮ㄥ垎灝嗕細琚嚜鍔ㄥ拷鐣ャ?
--姣斿璇達紝涓嬮潰榪欐SQL錛屼綘姘歌繙鏃犳硶寰楀埌“絎簩綾?#8221;榪欎釜緇撴灉
CASE WHEN col_1 IN ( 'a', 'b') THEN '絎竴綾?
WHEN col_1 IN ('a') THEN '絎簩綾?
ELSE'鍏朵粬' END
涓嬮潰鎴戜滑鏉ョ湅涓涓嬶紝浣跨敤Case鍑芥暟閮借兘鍋氫簺浠涔堜簨鎯呫?
涓錛屽凡鐭ユ暟鎹寜鐓у彟澶栦竴縐嶆柟寮忚繘琛屽垎緇勶紝鍒嗘瀽銆?/strong>
鏈夊涓嬫暟鎹?(涓轟簡鐪嬪緱鏇存竻妤氾紝鎴戝茍娌℃湁浣跨敤鍥藉浠g爜錛岃屾槸鐩存帴鐢ㄥ浗瀹跺悕浣滀負Primary Key)
鍥藉錛坈ountry錛?/td>
| 浜哄彛錛坧opulation錛?/td>
|
涓浗 |
600 |
緹庡浗 |
100 |
鍔犳嬁澶?/td>
| 100 |
鑻卞浗 |
200 |
娉曞浗 |
300 |
鏃ユ湰 |
250 |
寰峰浗 |
200 |
澧ㄨタ鍝?/td>
| 50 |
鍗板害 |
250 |
鏍規嵁榪欎釜鍥藉浜哄彛鏁版嵁錛岀粺璁′簹媧插拰鍖楃編媧茬殑浜哄彛鏁伴噺銆傚簲璇ュ緱鍒頒笅闈㈣繖涓粨鏋溿?
媧?/td>
| 浜哄彛 |
浜氭床 |
1100 |
鍖楃編媧?/td>
| 250 |
鍏朵粬 |
700 |
鎯寵瑙e喅榪欎釜闂錛屼綘浼氭庝箞鍋氾紵鐢熸垚涓涓甫鏈夋床Code鐨刅iew錛屾槸涓涓В鍐蟲柟娉曪紝浣嗘槸榪欐牱寰堥毦鍔ㄦ佺殑鏀瑰彉緇熻鐨勬柟寮忋?
濡傛灉浣跨敤Case鍑芥暟錛孲QL浠g爜濡備笅:
SELECT SUM(population),
CASE country
WHEN '涓浗' THEN '浜氭床'
WHEN '鍗板害' THEN '浜氭床'
WHEN '鏃ユ湰' THEN '浜氭床'
WHEN '緹庡浗' THEN '鍖楃編媧?
WHEN '鍔犳嬁澶? THEN '鍖楃編媧?
WHEN '澧ㄨタ鍝? THEN '鍖楃編媧?
ELSE '鍏朵粬' END
FROM Table_A
GROUP BY CASE country
WHEN '涓浗' THEN '浜氭床'
WHEN '鍗板害' THEN '浜氭床'
WHEN '鏃ユ湰' THEN '浜氭床'
WHEN '緹庡浗' THEN '鍖楃編媧?
WHEN '鍔犳嬁澶? THEN '鍖楃編媧?
WHEN '澧ㄨタ鍝? THEN '鍖楃編媧?
ELSE '鍏朵粬' END;
鍚屾牱鐨勶紝鎴戜滑涔熷彲浠ョ敤榪欎釜鏂規硶鏉ュ垽鏂伐璧勭殑絳夌駭錛屽茍緇熻姣忎竴絳夌駭鐨勪漢鏁般係QL浠g爜濡備笅錛?
SELECT
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600 THEN '2'
WHEN salary > 600 AND salary <= 800 THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END salary_class,
COUNT(*)
FROM Table_A
GROUP BY
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600 THEN '2'
WHEN salary > 600 AND salary <= 800 THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END;
浜岋紝鐢ㄤ竴涓猄QL璇彞瀹屾垚涓嶅悓鏉′歡鐨勫垎緇勩?/strong>
鏈夊涓嬫暟鎹?
鍥藉錛坈ountry錛?/td>
| 鎬у埆錛坰ex錛?/td>
| 浜哄彛錛坧opulation錛?/td>
|
涓浗 |
1 |
340 |
涓浗 |
2 |
260 |
緹庡浗 |
1 |
45 |
緹庡浗 |
2 |
55 |
鍔犳嬁澶?/td>
| 1 |
51 |
鍔犳嬁澶?/td>
| 2 |
49 |
鑻卞浗 |
1 |
40 |
鑻卞浗 |
2 |
60 |
鎸夌収鍥藉鍜屾у埆榪涜鍒嗙粍錛屽緱鍑虹粨鏋滃涓?
鍥藉 |
鐢?/td>
| 濂?/td>
|
涓浗 |
340 |
260 |
緹庡浗 |
45 |
55 |
鍔犳嬁澶?/td>
| 51 |
49 |
鑻卞浗 |
40 |
60 |
鏅氭儏鍐典笅錛岀敤UNION涔熷彲浠ュ疄鐜扮敤涓鏉¤鍙ヨ繘琛屾煡璇€備絾鏄偅鏍峰鍔犳秷鑰?涓や釜Select閮ㄥ垎)錛岃屼笖SQL璇彞浼氭瘮杈冮暱銆?
涓嬮潰鏄竴涓槸鐢–ase鍑芥暟鏉ュ畬鎴愯繖涓姛鑳界殑渚嬪瓙
SELECT country,
SUM( CASE WHEN sex = '1' THEN
population ELSE 0 END), --鐢鋒т漢鍙?/span>
SUM( CASE WHEN sex = '2' THEN
population ELSE 0 END) --濂蟲т漢鍙?/span>
FROM Table_A
GROUP BY country;
榪欐牱鎴戜滑浣跨敤Select錛屽畬鎴愬浜岀淮琛ㄧ殑杈撳嚭褰㈠紡錛屽厖鍒嗘樉紺轟簡Case鍑芥暟鐨勫己澶с?
涓夛紝鍦–heck涓嬌鐢–ase鍑芥暟銆?/strong>
鍦–heck涓嬌鐢–ase鍑芥暟鍦ㄥ緢澶氭儏鍐典笅閮芥槸闈炲父涓嶉敊鐨勮В鍐蟲柟娉曘傚彲鑳芥湁寰堝浜烘牴鏈氨涓嶇敤Check錛岄偅涔堟垜寤鴻浣犲湪鐪嬭繃涓嬮潰鐨勪緥瀛愪箣鍚庝篃灝濊瘯涓涓嬪湪SQL涓嬌鐢–heck銆?
涓嬮潰鎴戜滑鏉ヤ婦涓緥瀛?
鍏徃A錛岃繖涓叕鍙告湁涓瀹氾紝濂寵亴鍛樼殑宸ヨ祫蹇呴』楂樹簬1000鍧椼傚鏋滅敤Check鍜孋ase鏉ヨ〃鐜扮殑璇濓紝濡備笅鎵紺?
CONSTRAINT check_salary CHECK
( CASE WHEN sex = '2'
THEN CASE WHEN salary > 1000
THEN 1 ELSE 0 END
ELSE 1 END = 1 )
濡傛灉鍗曠函浣跨敤Check錛屽涓嬫墍紺?
CONSTRAINT check_salary CHECK
( sex = '2' AND salary > 1000 )
濂寵亴鍛樼殑鏉′歡鍊掓槸絎﹀悎浜嗭紝鐢瘋亴鍛樺氨鏃犳硶杈撳叆浜嗐?
鍥涳紝鏍規嵁鏉′歡鏈夐夋嫨鐨刄PDATE銆?/strong>
渚嬶紝鏈夊涓嬫洿鏂版潯浠?
- 宸ヨ祫5000浠ヤ笂鐨勮亴鍛橈紝宸ヨ祫鍑忓皯10%
- 宸ヨ祫鍦?000鍒?600涔嬮棿鐨勮亴鍛橈紝宸ヨ祫澧炲姞15%
寰堝鏄撹冭檻鐨勬槸閫夋嫨鎵ц涓ゆUPDATE璇彞錛屽涓嬫墍紺?
--鏉′歡1
UPDATE Personnel
SET salary = salary * 0.9
WHERE salary >= 5000;
--鏉′歡2
UPDATE Personnel
SET salary = salary * 1.15
WHERE salary >= 2000 AND salary < 4600;
浣嗘槸浜嬫儏娌℃湁鎯寵薄寰楅偅涔堢畝鍗曪紝鍋囪鏈変釜浜哄伐璧?000鍧椼傞鍏堬紝鎸夌収鏉′歡1錛屽伐璧勫噺灝?0%錛屽彉鎴愬伐璧?500銆傛帴涓嬫潵榪愯絎簩涓猄QL鏃跺欙紝鍥犱負榪欎釜浜虹殑宸ヨ祫鏄?500鍦?000鍒?600鐨勮寖鍥翠箣鍐咃紝 闇澧炲姞15%錛屾渶鍚庤繖涓漢鐨勫伐璧勭粨鏋滄槸5175,涓嶄絾娌℃湁鍑忓皯錛屽弽鑰屽鍔犱簡銆傚鏋滆鏄弽榪囨潵鎵ц錛岄偅涔堝伐璧?600鐨勪漢鐩稿弽浼氬彉鎴愬噺灝戝伐璧勩傛殏涓斾笉綆¤繖涓绔犳槸澶氫箞鑽掕癁錛屽鏋滄兂瑕佷竴涓猄QL 璇彞瀹炵幇榪欎釜鍔熻兘鐨勮瘽錛屾垜浠渶瑕佺敤鍒癈ase鍑芥暟銆備唬鐮佸涓?
UPDATE Personnel
SET salary = CASE WHEN salary >= 5000
銆 THEN salary * 0.9
WHEN salary >= 2000 AND salary < 4600
THEN salary * 1.15
ELSE salary END;
榪欓噷瑕佹敞鎰忎竴鐐癸紝鏈鍚庝竴琛岀殑ELSE salary鏄繀闇鐨勶紝瑕佹槸娌℃湁榪欒錛屼笉絎﹀悎榪欎袱涓潯浠剁殑浜虹殑宸ヨ祫灝嗕細琚啓鎴怤Ull,閭e彲灝卞ぇ浜嬩笉濡欎簡銆傚湪Case鍑芥暟涓璄lse閮ㄥ垎鐨勯粯璁ゅ兼槸NULL錛岃繖鐐規槸闇瑕佹敞鎰忕殑鍦版柟銆?
榪欑鏂規硶榪樺彲浠ュ湪寰堝鍦版柟浣跨敤錛屾瘮濡傝鍙樻洿涓婚敭榪欑绱椿銆?
涓鑸儏鍐典笅錛岃鎯蟲妸涓ゆ潯鏁版嵁鐨凱rimary key,a鍜宐浜ゆ崲錛岄渶瑕佺粡榪囦復鏃跺瓨鍌紝鎷瘋礉錛岃鍥炴暟鎹殑涓変釜榪囩▼錛岃鏄嬌鐢–ase鍑芥暟鐨勮瘽錛屼竴鍒囬兘鍙樺緱綆鍗曞浜嗐?
p_key |
col_1 |
col_2 |
a |
1 |
寮犱笁 |
b |
2 |
鏉庡洓 |
c |
3 |
鐜嬩簲 |
鍋囪鏈夊涓婃暟鎹紝闇瑕佹妸涓婚敭a
鍜?code>b鐩鎬簰浜ゆ崲銆傜敤Case鍑芥暟鏉ュ疄鐜扮殑璇濓紝浠g爜濡備笅
UPDATE SomeTable
SET p_key = CASE WHEN p_key = 'a'
THEN 'b'
WHEN p_key = 'b'
THEN 'a'
ELSE p_key END
WHERE p_key IN ('a', 'b');
鍚屾牱鐨勪篃鍙互浜ゆ崲涓や釜Unique key銆傞渶瑕佹敞鎰忕殑鏄紝濡傛灉鏈夐渶瑕佷氦鎹富閿殑鎯呭喌鍙戠敓錛屽鍗婃槸褰撳垵瀵硅繖涓〃鐨勮璁¤繘琛屽緱涓嶅鍒頒綅錛屽緩璁鏌ヨ〃鐨勮璁℃槸鍚﹀Ε褰撱?
浜旓紝涓や釜琛ㄦ暟鎹槸鍚︿竴鑷寸殑媯鏌ャ?/strong>
Case鍑芥暟涓嶅悓浜嶥ECODE鍑芥暟銆傚湪Case鍑芥暟涓紝鍙互浣跨敤BETWEEN,LIKE,IS NULL,IN,EXISTS絳夌瓑銆傛瘮濡傝浣跨敤IN,EXISTS錛屽彲浠ヨ繘琛屽瓙鏌ヨ錛屼粠鑰?瀹炵幇鏇村鐨勫姛鑳姐?
涓嬮潰鍏蜂釜渚嬪瓙鏉ヨ鏄庯紝鏈変袱涓〃錛宼bl_A,tbl_B錛屼袱涓〃涓兘鏈塳eyCol鍒椼傜幇鍦ㄦ垜浠涓や釜琛ㄨ繘琛屾瘮杈冿紝tbl_A涓殑keyCol鍒楃殑鏁版嵁濡傛灉鍦╰bl_B鐨刱eyCol鍒楃殑鏁版嵁涓彲浠ユ壘鍒幫紝 榪斿洖緇撴灉'Matched',濡傛灉娌℃湁鎵懼埌錛岃繑鍥炵粨鏋?Unmatched'銆?
瑕佸疄鐜頒笅闈㈣繖涓姛鑳斤紝鍙互浣跨敤涓嬮潰涓ゆ潯璇彞
--浣跨敤IN鐨勬椂鍊?/span>
SELECT keyCol,
CASE WHEN keyCol IN ( SELECT keyCol FROM tbl_B )
THEN 'Matched'
ELSE 'Unmatched' END Label
FROM tbl_A;
--浣跨敤EXISTS鐨勬椂鍊?/span>
SELECT keyCol,
CASE WHEN EXISTS ( SELECT * FROM tbl_B
WHERE tbl_A.keyCol = tbl_B.keyCol )
THEN 'Matched'
ELSE 'Unmatched' END Label
FROM tbl_A;
浣跨敤IN鍜孍XISTS鐨勭粨鏋滄槸鐩稿悓鐨勩備篃鍙互浣跨敤NOT IN鍜孨OT EXISTS錛屼絾鏄繖涓椂鍊欒娉ㄦ剰NULL鐨勬儏鍐點?
鍏紝鍦–ase鍑芥暟涓嬌鐢ㄥ悎璁″嚱鏁?/strong>
鍋囪鏈変笅闈竴涓〃
瀛﹀彿(std_id) |
璇劇▼ID(class_id) |
璇劇▼鍚?class_name) |
涓諱慨flag錛坢ain_class_flg) |
100 |
1 |
緇忔祹瀛?/td>
| Y |
100 |
2 |
鍘嗗彶瀛?/td>
| N |
200 |
2 |
鍘嗗彶瀛?/td>
| N |
200 |
3 |
鑰冨彜瀛?/td>
| Y |
200 |
4 |
璁$畻鏈?/td>
| N |
300 |
4 |
璁$畻鏈?/td>
| N |
400 |
5 |
鍖栧 |
N |
500 |
6 |
鏁板 |
N |
鏈夌殑瀛︾敓閫夋嫨浜嗗悓鏃朵慨鍑犻棬璇劇▼(100,200)涔熸湁鐨勫鐢熷彧閫夋嫨浜嗕竴闂ㄨ紼?300,400,500)銆傞変慨澶氶棬璇劇▼鐨勫鐢燂紝瑕侀夋嫨涓闂ㄨ紼嬩綔涓轟富淇紝涓諱慨flag閲岄潰鍐欏叆 Y銆傚彧閫夋嫨涓闂ㄨ紼嬬殑瀛︾敓錛屼富淇甪lag涓篘(瀹為檯涓婅鏄啓鍏鐨勮瘽錛屽氨娌℃湁涓嬮潰鐨勯夯鐑︿簨浜嗭紝涓轟簡涓句緥瀛愶紝榪樿澶氬鍖呭惈)銆?
鐜板湪鎴戜滑瑕佹寜鐓т笅闈袱涓潯浠跺榪欎釜琛ㄨ繘琛屾煡璇?
- 鍙変慨涓闂ㄨ紼嬬殑浜猴紝榪斿洖閭i棬璇劇▼鐨処D
- 閫変慨澶氶棬璇劇▼鐨勪漢錛岃繑鍥炴墍閫夌殑涓昏紼婭D
綆鍗曠殑鎯蟲硶灝辨槸錛屾墽琛屼袱鏉′笉鍚岀殑SQL璇彞榪涜鏌ヨ銆?
鏉′歡1
--鏉′歡1錛氬彧閫夋嫨浜嗕竴闂ㄨ紼嬬殑瀛︾敓
SELECT std_id, MAX(class_id) AS main_class
FROM Studentclass
GROUP BY std_id
HAVING COUNT(*) = 1;
鎵ц緇撴灉1
STD_ID MAIN_class
------ ----------
300 4
400 5
500 6
鏉′歡2
--鏉′歡2錛氶夋嫨澶氶棬璇劇▼鐨勫鐢?/span>
SELECT std_id, class_id AS main_class
FROM Studentclass
WHERE main_class_flg = 'Y' ;
鎵ц緇撴灉2
STD_ID MAIN_class
------ ----------
100 1
200 3
濡傛灉浣跨敤Case鍑芥暟錛屾垜浠彧瑕佷竴鏉QL璇彞灝卞彲浠ヨВ鍐抽棶棰橈紝鍏蜂綋濡備笅鎵紺?
SELECT std_id,
CASE WHEN COUNT(*) = 1 --鍙夋嫨涓闂ㄨ紼嬬殑瀛︾敓鐨勬儏鍐?/span>
THEN MAX(class_id)
ELSE MAX(CASE WHEN main_class_flg = 'Y'
THEN class_id
ELSE NULL END
)
END AS main_class
FROM Studentclass
GROUP BY std_id;
榪愯緇撴灉
STD_ID MAIN_class
------ ----------
100 1
200 3
300 4
400 5
500 6
閫氳繃鍦–ase鍑芥暟涓祵濂桟ase鍑芥暟錛屽湪鍚堣鍑芥暟涓嬌鐢–ase鍑芥暟絳夋柟娉曪紝鎴戜滑鍙互杞繪澗鐨勮В鍐寵繖涓棶棰樸備嬌鐢–ase鍑芥暟緇欐垜浠甫鏉ヤ簡鏇村ぇ鐨勮嚜鐢卞害銆?
鏈鍚庢彁閱掍竴涓嬩嬌鐢–ase鍑芥暟鐨勬柊鎵嬫敞鎰忎笉瑕佺姱涓嬮潰鐨勯敊璇?
CASE col_1
WHEN 1 銆 THEN 'Right'
WHEN NULL THEN 'Wrong'
END
鍦ㄨ繖涓鍙ヤ腑When Null榪欎竴琛屾繪槸榪斿洖unknown錛屾墍浠ユ案榪滀笉浼氬嚭鐜癢rong鐨勬儏鍐點傚洜涓鴻繖鍙ュ彲浠ユ浛鎹㈡垚WHEN col_1 = NULL錛岃繖鏄竴涓敊璇殑鐢ㄦ硶錛岃繖涓椂鍊欐垜浠簲璇ラ夋嫨鐢╓HEN col_1 IS NULL銆?/p>