SQL總複習二:CASE表示式的妙用
阿新 • • 發佈:2021-10-19
SQL中的case表示式的作用是用來對“某個變數”進行某種轉化,通常在select字句中使用
基本用法
舉個例子:
不難看出,case
表示式很像我們的 if else
的作用,在發現為真的 WHEN
子句時,CASE
表示式的真假值判斷就會中止,而剩餘的 WHEN
子句會被忽略。case
表示式有兩種寫法:
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
else
這句非必須但最好帶上,如果when
else
控制,那麼,這樣的case會返回null,null不是個好東西,所以你一定要儘量控制減少返回null的情況。- 簡單點說,在能寫列名和常量的地方,通常都可以寫
CASE
表示式,因為它返回的是一個標量值。
使用case實現不同條件的統計
有如下一個表:
上圖中,下半部分查詢結果如何得到呢?即如果讓你查詢出各個省份的男生總數和女生總數你會怎麼搞呢?
看看如何用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
在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 salay END;
生成每月資料統計報表
有以下兩張表:
那麼SQL語句可以這樣寫:
-- 表的匹配:使用IN 謂詞
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;
-- 表的匹配:使用EXISTS 謂詞
SELECT CM.course_name,
CASE WHEN EXISTS
(SELECT course_id FROM OpenCourses OC
WHERE month = 200706
AND OC.course_id = CM.course_id) THEN '○'
ELSE '×' END AS "6 月",
CASE WHEN EXISTS
(SELECT course_id FROM OpenCourses OC
WHERE month = 200707
AND OC.course_id = CM.course_id) THEN '○'
ELSE '×' END AS "7 月",
CASE WHEN EXISTS
(SELECT course_id FROM OpenCourses OC
WHERE month = 200708
AND OC.course_id = CM.course_id) THEN '○'
ELSE '×' END AS "8 月"
FROM CourseMaster CM;
case與行轉換成列
SELECT name,
CASE WHEN SUM(CASE WHEN course = 'SQL 入門' THEN 1 ELSE NULL END) = 1
THEN '○' ELSE NULL END AS "SQL 入門",
CASE WHEN SUM(CASE WHEN course = 'UNIX 基礎' THEN 1 ELSE NULL END) = 1
THEN '○' ELSE NULL END AS "UNIX 基礎",
CASE WHEN SUM(CASE WHEN course = 'Java 中級' THEN 1 ELSE NULL END) = 1
THEN '○' ELSE NULL END AS "Java 中級 "
FROM Courses
GROUP BY name;
case與null
當case使用的變數或列的值可能為null時,唯一正確的使用方式如下:
CASE
WHEN col_1 = 1 THEN '○'
WHEN col_1 IS NULL THEN '×'
END
--而不是:
CASE col_1
WHEN 1 THEN '○'
WHEN NULL THEN '×'
END