一:case表達式的用法
1、SQL中的case表達式的作用是用來對“某個變量”進行某種轉化,通常在select字句中使用,舉個例子:
不能看出,case表達式很像我們的if else的作用,在發現為真的 WHEN
子句時,CASE
表達式的真假值判斷就會中止,而剩余的 WHEN
子句會被忽略。case表達式有兩種寫法:
-- 簡單CASE 表達式
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
-- 搜索CASE 表達式
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
注意點:
* else這句非必須但最好帶上,如果when中沒有符合條件的,且有沒有else控制,那么,這樣的case會返回null,null不是個好東西,所以你一定要盡量控制減少返回null的情況。
* 簡單點說,在能寫列名和常量的地方,通常都可以寫 CASE
表達式,因為它返回的是一個標量值。
2、使用case實現不同條件的統計:
還是上一個學生表,如果讓你查詢出各個省份的男生總數和女生總數你會怎么搞呢?
我反正稍加思考,可以想到這樣寫:
--查看所有學生信息 select StudentID,[Name],Province,Gender,(case Gender when 0 then N'女' when 1 then N'男' else '' end) StuGender from dbo.T_Student --查詢出各省的男女生總數: select p.Province,sum(p.MaleCount) TotalMale,sum(p.FamaleCount) TotalFamale
from ( select Province, count(1) MaleCount,0 as FamaleCount from dbo.T_Student where gender=1 group by Province union select Province, 0,count(1) FamaleCount from dbo.T_Student where gender=0 group by Province )as p group by p.Province
對應的執行結果:
so,可以看到,能實現功能,但是代碼卻那么長,看着不舒服,這時咱們看看如何用case來拯救世界吧:
--查看所有學生信息 select StudentID,[Name],Province,Gender,(case Gender when 0 then N'女' when 1 then N'男' else '' end) StuGender from dbo.T_Student --查詢出各省的男女生總數: select Province, sum(case when Gender=1 then 1 else 0 end ) as MaleCount, sum(case when Gender=0 then 1 else 0 end ) as FeMaleCount from dbo.T_Student group by Province
執行結果:
so,僅僅5行就搞定了,差別很明顯,新手where,高手case,good。
3、在update操作中使用case條件分支,比如有個員工表Salaries,工資字段為salary ,
假設現在需要根據以下條件對該表的數據進行更新。
- 對當前工資為 30 萬日元以上的員工,降薪 10%。
- 對當前工資為 25 萬日元以上且不滿 28 萬日元的員工,加薪 20%。
那么更新的SQL語句可以這樣寫:
-- 用CASE 表達式寫正確的更新操作 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;
** 參考:圖靈社區的《SQL進價教程》一書。