成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

SQL中case?when用法及使用案例詳解

瀏覽:241日期:2023-09-29 21:02:28
目錄一、語法二、case when應用場景2.1 案例一2.2 案例二2.3 案例三三、擴展3.1 根據條件有選擇的UPDATE四、參考來源一、語法

Case具有兩種格式。簡單Case函數和Case搜索函數。

簡單Case函數格式:

CASE 列名WHEN 條件值1 THEN 選項1WHEN 條件值2 THEN 選項2……ELSE 默認值END

Case搜索函數:

CASEWHEN 條件1 THEN 選項1WHEN 條件2 THEN 選項2……ELSE 默認值END二、case when應用場景

case when與子查詢性能比較及優化。為了方便說明,我們先創建表,并造點數據。

CREATE TABLE `table_a` (`id` INT NOT NULL AUTO_INCREMENT,`country` VARCHAR(50) NOT NULL,`sex` CHAR(2) not null,`population` int NOT NULL,PRIMARY KEY (`id`));insert into table_a values(null,'中國','男',10);insert into table_a values(null,'中國','女',5);insert into table_a values(null,'美國','男',2);insert into table_a values(null,'美國','女',4);insert into table_a values(null,'加拿大','男',4);insert into table_a values(null,'加拿大','女',4);insert into table_a values(null,'英國','男',6);insert into table_a values(null,'英國','女',6);insert into table_a values(null,'法國','男',2);insert into table_a values(null,'法國','女',2);insert into table_a values(null,'日本','男',7);insert into table_a values(null,'日本','女',7);insert into table_a values(null,'德國','男',2);insert into table_a values(null,'墨西哥','男',7);insert into table_a values(null,'印度','男',1);2.1 案例一

統計亞洲和北美洲的人口數量,要求結果如下:

若第一時間沒有想到case when,我們可能會寫出下面的sql:

SELECT sum(population) from Table_A where country in ('中國','印度','日本')UNIONSELECT sum(population) from Table_A where country in ('美國','加拿大','墨西哥')UNIONSELECT sum(population) from Table_A where country not in ('中國','印度','日本','美國','加拿大','墨西哥');

運行結果:

這個sql的性能效率比較低,對同一個數據表查詢了三次,也無法獲得州的那一列。

使用case when進行改造,如下:

SELECT SUM(population)FROM Table_A GROUP BYCASE country WHEN '中國' THEN '亞洲' WHEN '印度' THEN '亞洲'WHEN '日本' THEN '亞洲' WHEN '美國' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END;

運行結果:

使用了case when的sql語句明顯效率高一些,因為它僅查找了一次表而已,若想獲得州的那一列,只需改寫如下:

SELECT SUM(population), (CASE country WHEN '中國' THEN '亞洲' WHEN '印度' THEN '亞洲' WHEN '日本' THEN '亞洲' WHEN '美國' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END ) as 州FROM Table_A GROUP BYCASE country WHEN '中國' THEN '亞洲' WHEN '印度' THEN '亞洲'WHEN '日本' THEN '亞洲' WHEN '美國' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END;

運行結果:

2.2 案例二

統計每個國家的男生人數和女生人數,要求結果如下:

同樣的,不使用case when的寫法如下:

SELECTa.country,(SELECTSUM( a1.population ) FROMtable_a a1 WHEREa1.country = a.country AND a1.sex = '男' ) 男,(SELECTSUM( a1.population ) FROMtable_a a1 WHEREa1.country = a.country AND a1.sex = '女' ) 女 FROMtable_a a GROUP BYa.country;

執行結果:

使用case when進行優化:

SELECT COUNTRY,SUM(CASE SEX WHEN '男' THEN population ELSE 0 END) AS '男',SUM(CASE SEX WHEN '女' THEN population ELSE 0 END) AS '女'FROM table_a GROUP BY COUNTRY;

執行結果:

兩者對比,顯然的case when的效率既簡潔,效率也高。

2.3 案例三

上述兩個案例也許不夠貼近日常的工作內容,下面舉個現實工作遇到的案例。

建表sql如下:

-- 貨架表CREATE TABLE `shelves` (`shelves_id` INT NOT NULL AUTO_INCREMENT, -- 貨架id`shelves_num` VARCHAR(50) NOT NULL UNIQUE,-- 貨架號`shelves_area` VARCHAR(50) NOT NULL,--貨架區域PRIMARY KEY (`shelves_id`));-- 物品表CREATE TABLE `goods` (`goods_id` INT NOT NULL AUTO_INCREMENT, -- 物品id`goods_name` VARCHAR(50) NOT NULL UNIQUE,-- 物品名稱`goods_type` VARCHAR(20) NOT NULL,-- 物品類型`goods_quantity` int NOT NULL,-- 物品數量`goods_createTime` DATETIME NULL DEFAULT NULL,-- 創建時間`goods_expiryTime` DATETIME NULL DEFAULT NULL,-- 過期時間`goods_shelvesId` INT NULL DEFAULT NULL,-- 貨架idPRIMARY KEY (`goods_id`));

需求說明:統計每個貨架上的物品數量,要求統計結果如下

使用子查詢的寫法:

SELECTshelves_area shelvesArea,shelves_num shelvesNum,COUNT( DISTINCT goods_type ) goodsTypeSum,COUNT( goods_id ) goodsSum,(SELECTCOUNT(*)FROMgoodsWHEREgoods_expiryTime < NOW()AND goods_shelvesId = shelves_id ) isNotExpiry,(SELECTCOUNT(*)FROMgoodsWHEREgoods_expiryTime > NOW()AND goods_shelvesId = shelves_id) isExpiryFROMshelvesLEFT JOIN goods ON shelves_id = goods_shelvesIdGROUP BY shelves_id;

使用case when的寫法:

SELECTshelves_area shelvesArea,shelves_num shelvesNum,COUNT( DISTINCT goods_type ) goodsTypeSum,COUNT( goods_id ) goodsSum,SUM(CASE WHEN (shelves_id = goods_shelvesId AND goods_expiryTime < NOW()) THEN 1 ELSE 0 END) isNotExpiry,SUM(CASE WHEN (shelves_id = goods_shelvesId AND goods_expiryTime > NOW()) THEN 1 ELSE0 END) isExpiryFROMshelvesLEFT JOIN goods ON shelves_id = goods_shelvesIdGROUP BY shelves_id;

兩個不同寫法的運行結果是一樣的,但是性能效率上case when 顯然比子查詢的高一些。運行結果如下(本人未造相關測試數據):

三、擴展3.1 根據條件有選擇的UPDATE

例,有如下更新條件1.工資5000以上的職員,工資減少10%2.工資在2000到4600之間的職員,工資增加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;

但是事情沒有想象得那么簡單,假設有個人工資5000塊。首先,按照條件1,工資減少10%,變成工資4500。接下來運行第二個SQL時候,因為這個人的工資是4500在2000到4600的范圍之內,需增加15%,最后這個人的工資結果是5175,不但沒有減少,反而增加了。如果要是反過來執行,那么工資4600的人相反會變成減少工資。暫且不管這個規章是多么荒誕,如果想要一個SQL 語句實現這個功能的話,我們需要用到Case函數。代碼如下:

UPDATE Personnel SET salary = CASE WHEN salary >= 5000 THEN salary * 0.9 WHEN salary >= 2000 AND salary < 4600 THEN salary * 1.15ELSE salary END;

這里要注意一點,最后一行的ELSE salary是必需的,要是沒有這行,不符合這兩個條件的人的工資將會被寫成NUll,那可就大事不妙了。在Case函數中Else部分的默認值是NULL,這點是需要注意的地方。

這種方法還可以在很多地方使用,比如說變更主鍵這種累活。一般情況下,要想把兩條數據的Primary key,a和b交換,需要經過臨時存儲,拷貝,讀回數據的三個過程,要是使用Case函數的話,一切都變得簡單多了。p_key col_1 col_2a 1 張三b 2 李四c 3 王五假設有如上數據,需要把主鍵a和b相互交換。用Case函數來實現的話,代碼如下

UPDATE SomeTable SET p_key = CASE WHEN p_key = 'a' THEN 'b' WHEN p_key = 'b' THEN 'a'ELSE p_key ENDWHERE p_key IN('a', 'b');四、參考來源

https://blog.csdn.net/Max_Rzdq/article/details/79418893

到此這篇關于SQL中case when用法詳解及使用案例的文章就介紹到這了,更多相關sql case when用法內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MsSQL 數據庫
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
久久精品国产99精品国产亚洲性色| 色先锋资源久久综合| 亚洲女爱视频在线| 日韩一区二区三区高清免费看看| 久久裸体视频| 一区二区三区视频在线播放| 欧美不卡高清| 不卡在线观看av| 韩国欧美一区二区| 日韩影院免费视频| 亚洲一区二区偷拍精品| 国产人成亚洲第一网站在线播放| 日韩手机在线导航| 3d动漫精品啪啪1区2区免费 | 欧美经典一区二区三区| 欧美一区二区视频在线观看2022| 欧美综合天天夜夜久久| 久久精品三级| 国产一区二区三区黄| 激情久久婷婷| 国内精品久久久久久久果冻传媒| 91啪亚洲精品| 成人av资源网站| 成人一道本在线| 国产suv精品一区二区三区| 国产一区二区三区四区五区美女 | 久久综合久久综合九色| 色老头久久综合| 国产偷自视频区视频一区二区| 欧美一区亚洲二区| 高清国产一区二区| 精品一区二区三区在线观看| 亚洲一区二区成人在线观看| 最新国产の精品合集bt伙计| 久久久精品综合| 亚洲国产专区校园欧美| 成人av网站大全| 美腿丝袜亚洲综合| 亚洲国产精品人人做人人爽| 成人免费在线播放视频| 国产欧美1区2区3区| 精品国产三级a在线观看| 欧美日韩视频在线第一区| 老牛嫩草一区二区三区日本| 国产精品久久波多野结衣| 亚洲精品中文在线观看| 欧美日韩亚洲一区二区三区在线| 国产高清亚洲一区| 精品一区二区av| 免费av网站大全久久| 天堂一区二区在线| 亚洲精品乱码久久久久久久久| 国产性天天综合网| 亚洲精品一区二区三区香蕉| 91精品国产91久久久久久最新毛片| 欧美视频完全免费看| 色天天综合色天天久久| 亚洲女同在线| 国产欧美另类| 一本色道久久综合| 国产毛片精品一区| 精品一区二区三区在线播放视频| 免费成人av资源网| 天天操天天干天天综合网| 一区二区国产视频| 亚洲黄色尤物视频| 一区二区理论电影在线观看| 亚洲精品免费电影| 亚洲精品少妇30p| 一区二区三区四区在线免费观看| 久久一区精品| 三级欧美韩日大片在线看| 亚洲成人自拍网| 午夜影院久久久| 日韩成人dvd| 蜜臀av性久久久久蜜臀aⅴ| 免费观看成人av| 国内精品伊人久久久久av一坑| 狠狠狠色丁香婷婷综合久久五月| 蓝色福利精品导航| 激情五月婷婷综合| 国产高清不卡二三区| 国产精品一区专区| 成人深夜在线观看| 北岛玲一区二区三区四区| 天堂va蜜桃一区二区三区漫画版| 亚洲不卡av一区二区三区| 三级久久三级久久久| 蜜臀久久久久久久| 韩国理伦片一区二区三区在线播放 | 五月婷婷综合网| 无码av中文一区二区三区桃花岛| 葵司免费一区二区三区四区五区| 毛片av中文字幕一区二区| 日本伊人午夜精品| 国内外成人在线| 成人黄色国产精品网站大全在线免费观看| 成人av资源站| 欧美性天天影院| 亚洲午夜极品| 国产免费成人| 在线国产电影不卡| 欧美三级韩国三级日本一级| 宅男噜噜噜66一区二区66| 精品国产区一区| 国产精品乱人伦一区二区| 一区二区三区四区乱视频| 国产欧美一区二区精品婷婷| 国产精品久久久久久福利一牛影视| 中文字幕在线不卡视频| 亚洲一区二区三区四区在线免费观看| 日韩福利视频导航| 国产精品一区专区| 欧美大香线蕉线伊人久久国产精品| 欧美视频一区| 亚洲一区二区三区四区五区午夜| 91成人网在线| 日韩一区二区三区四区| 国产精品一区二区不卡| 日产精品久久久久久久性色| 国产麻豆精品视频| 欧美承认网站| 99视频+国产日韩欧美| 色88888久久久久久影院按摩| 欧美三级在线看| 337p日本欧洲亚洲大胆色噜噜| 国产精品嫩草久久久久| 亚洲影院在线观看| 精品一区二区国语对白| 91影视在线播放| 一本色道久久99精品综合| 欧美在线free| 久久久午夜精品| 一区二区三区av电影| 中文字幕乱码日本亚洲一区二区| 亚洲国产精品自拍| 国产精品一区不卡| 亚洲无线视频| 亚洲精品免费在线播放| 久久婷婷色综合| 一区二区三区av电影| 狠狠色综合日日| 欧美日韩国产探花| 久久亚洲二区| 男人的天堂成人在线| 欧美一区永久视频免费观看| 欧美经典一区二区| 五月天网站亚洲| 国产.精品.日韩.另类.中文.在线.播放 | 精品成人国产| 一区精品久久| 久久青草久久| 日韩免费福利电影在线观看| 亚洲欧洲国产日韩| 久久99精品久久久久婷婷| 91亚洲精品一区二区乱码| 国产精品美女久久久浪潮软件| 欧美日韩国产精选| 国产精品国产自产拍在线| 蜜臀久久久99精品久久久久久| 99国内精品久久| 久久高清国产| 精品国产一区二区三区忘忧草| 一卡二卡欧美日韩| 成人夜色视频网站在线观看| 一区二区精品在线| 7878成人国产在线观看| 亚洲欧洲成人精品av97| 国产美女精品在线| 国产欧美短视频| 欧美电影免费观看高清完整版| 一区二区三区国产精品| 成人高清视频在线观看| 亚洲欧美日韩国产综合精品二区| 日韩一本二本av| 亚洲高清免费观看| 91论坛在线播放| 欧美视频一二三区| 亚洲欧美精品午睡沙发| 国产激情一区二区三区桃花岛亚洲| 宅男噜噜噜66国产日韩在线观看| 欧美色区777第一页| 综合中文字幕亚洲| 成人性生交大片免费看中文 | 国产无遮挡一区二区三区毛片日本| 丝袜国产日韩另类美女| 欧美一区二区三区另类| 欧美丝袜自拍制服另类| 亚洲欧美另类久久久精品| 成人激情动漫在线观看| 久久综合九色综合网站| 国产欧美在线观看一区| 久久激五月天综合精品| 亚洲精品在线观看免费| 精品少妇一区二区三区免费观看| 日韩国产在线观看| 亚洲二区三区四区| 91麻豆精品国产综合久久久久久| 亚洲图片欧美一区| 欧美日韩天天操|