CASE WHEN 條件表達式
什麼是 CASE WHEN?
比喻:CASE WHEN 就像 if-else 🔀
在 C# 裡你用 if-else 判斷邏輯, 在 SQL 裡就用 CASE WHEN 做同樣的事。
基本語法
SELECT
Name,
Score,
CASE
WHEN Score >= 90 THEN '優秀' -- ← 條件 1
WHEN Score >= 80 THEN '良好' -- ← 條件 2
WHEN Score >= 60 THEN '及格' -- ← 條件 3
ELSE '不及格' -- ← 以上都不符
END AS 等級 -- ← END 結束,AS 取名
FROM Students;
逐行解析:
CASE -- 開始條件判斷
WHEN Score >= 90 THEN '優秀' -- 如果 Score >= 90,回傳 '優秀'
WHEN Score >= 80 THEN '良好' -- 否則如果 >= 80,回傳 '良好'
WHEN Score >= 60 THEN '及格' -- 否則如果 >= 60,回傳 '及格'
ELSE '不及格' -- 以上都不符合,回傳 '不及格'
END AS 等級 -- END 結束 CASE,AS 給欄位命名
結果:
Name | Score | 等級
------+-------+------
小明 | 85 | 良好
小華 | 92 | 優秀
小美 | 58 | 不及格
在 WHERE 中使用
-- 根據條件過濾
SELECT * FROM Orders
WHERE
CASE
WHEN Status = 'vip' THEN Amount > 0
ELSE Amount > 100
END;
在 ORDER BY 中使用
-- 自訂排序順序
SELECT Name, Status
FROM Students
ORDER BY
CASE Status
WHEN 'active' THEN 1 -- ← active 排第一
WHEN 'pending' THEN 2 -- ← pending 排第二
WHEN 'inactive' THEN 3 -- ← inactive 排第三
ELSE 4
END;
搭配聚合函數 — 條件統計
-- 統計每個等級的人數
SELECT
COUNT(CASE WHEN Score >= 90 THEN 1 END) AS 優秀人數,
COUNT(CASE WHEN Score >= 60 AND Score < 90 THEN 1 END) AS 及格人數,
COUNT(CASE WHEN Score < 60 THEN 1 END) AS 不及格人數
FROM Students;
結果:
優秀人數 | 及格人數 | 不及格人數
---------+---------+-----------
5 | 20 | 5
行轉列(Pivot)
-- 每個科系各等級的人數
SELECT
Department,
COUNT(CASE WHEN Score >= 90 THEN 1 END) AS 優秀,
COUNT(CASE WHEN Score >= 60 AND Score < 90 THEN 1 END) AS 及格,
COUNT(CASE WHEN Score < 60 THEN 1 END) AS 不及格
FROM Students
GROUP BY Department;
結果:
Department | 優秀 | 及格 | 不及格
-----------+------+------+---------
資工系 | 3 | 8 | 2
電機系 | 2 | 6 | 1
COALESCE — 處理 NULL
-- COALESCE 回傳第一個非 NULL 的值
SELECT
Name,
COALESCE(Phone, Email, '無聯絡方式') AS 聯絡方式
FROM Students;
-- Phone 有值 → 用 Phone
-- Phone 是 NULL,Email 有值 → 用 Email
-- 兩個都 NULL → 用 '無聯絡方式'
NULLIF
-- NULLIF(a, b) = 如果 a = b 就回傳 NULL,否則回傳 a
-- 常用來避免除以零
SELECT
Department,
Total,
Passed,
Total / NULLIF(Passed, 0) AS 比率 -- ← Passed=0 時變 NULL 而不是錯誤
FROM DeptStats;
小結
| 語法 | 用途 |
|---|---|
CASE WHEN ... THEN ... END |
SQL 的 if-else |
搭配 COUNT/SUM |
條件統計 |
搭配 ORDER BY |
自訂排序 |
COALESCE(a, b, c) |
第一個非 NULL |
NULLIF(a, b) |
a=b 時回傳 NULL |