case?when?then?else?end語(yǔ)句的用法(附demo)
case具有兩種格式。簡(jiǎn)單case函數(shù)和case搜索函數(shù)。
- case :表示需要處理的字段
- when :表示條件
- then :表示當(dāng)when執(zhí)行為true時(shí),再執(zhí)行的語(yǔ)句
- else :表示當(dāng)所有的when執(zhí)行為false時(shí),再執(zhí)行的語(yǔ)句
- end:表示 case 語(yǔ)句結(jié)束的結(jié)尾
--簡(jiǎn)單case函數(shù)
case sex when '1' then '男' when '2' then '女' else '其他' end
--case搜索函數(shù)--經(jīng)常用的是這個(gè)
case when sex = '1' then '男' when sex = '2' then '女' else '其他' end
這兩種方式,可以實(shí)現(xiàn)相同的功能。簡(jiǎn)單case函數(shù)的寫法相對(duì)比較簡(jiǎn)潔,但是和case搜索函數(shù)相比,功能方面會(huì)有些限制,比如寫判定式。
還有一個(gè)需要注重的問題,case函數(shù)只返回第一個(gè)符合條件的值,剩下的case部分將會(huì)被自動(dòng)忽略。
--比如說,下面這段sql,你永遠(yuǎn)無(wú)法得到“第二類”這個(gè)結(jié)果
case when col_1 in ( 'a', 'b') then'第一類' when col_1 in ('a') then '第二類' else '其他' end
這是原始表:
例子一:看下select函數(shù)加case函數(shù)和不加case函數(shù)的區(qū)別
不加case函數(shù)的,SELECT id,name,core,sex FROM student a ;
加case函數(shù)的,SELECT (CASE WHEN a.`name`='張三' THEN a.core ELSE 0 END) AS '張三' , id,name,core,sex FROM student a ;
可以看到,加了case函數(shù)的就是自己?jiǎn)为?dú)成一列,就是比不加多了一列數(shù)據(jù),它并不會(huì)改變行的數(shù)量.
例子二: 介紹下case函數(shù)的執(zhí)行過程.
SELECT (CASE WHEN a.`name`='張三' THEN a.core ELSE 0 END) AS '張三' FROM student a ;
上面的執(zhí)行過程:
進(jìn)行匹配的是名字name,首先匹配第一行,name是等于張三,所以返回core也就是50
匹配第二行,name等于李四,不匹配,返回else的值也就是0
匹配第三行,name等于王五,不匹配,返回else的值也就是0
匹配第四行,name等于趙六,不匹配,返回else的值也就是0
所以得到結(jié)果:
例子三: 看下case函數(shù)后面加不加as的區(qū)別
先看下加as, SELECT (CASE WHEN a.`name`='張三' THEN a.core ELSE 0 END) AS '張三' FROM student a ;
然后是不加as, SELECT (CASE WHEN a.`name`='張三' THEN a.core ELSE 0 END) FROM student a ;
可以看到, 加as就是對(duì)生成的列取個(gè)別名, 不加as的話默認(rèn)的列名就是 case這整個(gè)標(biāo)簽.
例子四:一列里面多次條件匹配
SELECT (CASE WHEN a.`name`='張三' THEN a.core WHEN a.`name`='李四' THEN a.core END) AS '張三' FROM student a ;
執(zhí)行過程:第一行匹配張三成功,返回50,第二行匹配李四成功返回60,三四兩行不匹配返回null
例子五:多列的單條件匹配
SELECT (CASE WHEN a.`name`='張三' THEN a.core END) AS '張三',(CASE WHEN a.`name`='李四' THEN a.core END) AS '李四' FROM student a;
總結(jié)case語(yǔ)句能將行轉(zhuǎn)換成列
例子六:實(shí)戰(zhàn)一
有如下數(shù)據(jù):
根據(jù)這個(gè)國(guó)家人口數(shù)據(jù),統(tǒng)計(jì)亞洲和北美洲的人口數(shù)量。得到下面這個(gè)結(jié)果:
查詢sql:
select sum(population), case country when '中國(guó)' then'亞洲' when '印度' then'亞洲' when '日本' then'亞洲' when '美國(guó)' then'北美洲' when '加拿大' then'北美洲' when '墨西哥' then'北美洲' else '其他' end from table_a group by case country when '中國(guó)' then'亞洲' when '印度' then'亞洲' when '日本' then'亞洲' when '美國(guó)' then'北美洲' when '加拿大' then'北美洲' when '墨西哥' then'北美洲' else '其他' end;
例子七:實(shí)戰(zhàn)二
有如下數(shù)據(jù):
按照國(guó)家和性別進(jìn)行分組,得出結(jié)果如下:
查詢sql:
select country, sum( case when sex = '1' then population else 0 end), --男性人口 sum( case when sex = '2' then population else 0 end) --女性人口 from table_a group by country;
到此這篇關(guān)于case when then else end語(yǔ)句的用法(附demo)的文章就介紹到這了,更多相關(guān)case when then else end內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
完美解決MSSQL"以前的某個(gè)程序安裝已在安裝計(jì)算機(jī)上創(chuàng)建掛起的文件操作"
以前裝過sql server,后來(lái)刪掉?,F(xiàn)在重裝,卻出現(xiàn)“以前的某個(gè)程序安裝已在安裝計(jì)算機(jī)上創(chuàng)建掛起的文件操作。運(yùn)行安裝程序之前必須重新啟動(dòng)計(jì)算機(jī)”錯(cuò)誤。無(wú)法進(jìn)行下去。 現(xiàn)在又遇到了,終于完全搞定.2008-11-11SQL server數(shù)據(jù)庫(kù)創(chuàng)建代碼 filegroup文件組修改的示例代碼
這篇文章主要介紹了SQL server數(shù)據(jù)庫(kù)創(chuàng)建代碼 filegroup文件組修改的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08關(guān)于 SQL Server ErrorLog 錯(cuò)誤日志說明
關(guān)于 SQL Server ErrorLog 錯(cuò)誤日志說明學(xué)習(xí)sqlserver的朋友可以參考下。2011-04-04通過分析SQL語(yǔ)句的執(zhí)行計(jì)劃優(yōu)化SQL
基于代價(jià)的優(yōu)化器是很聰明的,在絕大多數(shù)情況下它會(huì)選擇正確的優(yōu)化器,減輕了DBA的負(fù)擔(dān)。但有時(shí)它也聰明反被聰明誤,選擇了很差的執(zhí)行計(jì)劃,使某個(gè)語(yǔ)句的執(zhí)行變得奇慢無(wú)比2011-10-10SQL?Sever無(wú)法連接服務(wù)器圖文解決辦法
SQL數(shù)據(jù)庫(kù)不能連接服務(wù)器是指在使用SQL數(shù)據(jù)庫(kù)時(shí),無(wú)法建立與服務(wù)器的連接,這可能是由于多種原因?qū)е碌?包括網(wǎng)絡(luò)問題、配置錯(cuò)誤、權(quán)限限制等,下面這篇文章主要給大家介紹了關(guān)于SQL?Sever無(wú)法連接服務(wù)器的解決辦法,需要的朋友可以參考下2024-06-06