☕ NEW! 完成新手任務即可參加抽獎!LINE 星巴克禮券等你拿,名額有限!        🎉 推廣活動:邀請好友註冊 DevLearn,累積推薦抽 LINE 星巴克禮券! 活動詳情 →        🔥 活動期間 2026/4/1 - 5/31 |已有 0 人參加       
sql 中級

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

💡 大家的想法 · 0

載入中...
💬 即時聊天室 🟢 0 人在線
😀 😎 🤓 💻 🎮 🎸 🔥
➕ 新問題
📋 我的工單
💬 LINE 社群
🔒
需要註冊才能使用此功能
註冊帳號即可解鎖測驗、遊戲、簽到、筆記下載等所有功能,完全免費!
免費註冊