課程 28:條件邏輯控制
掌握 SQL 中的條件邏輯控制技巧,學會使用 CASE WHEN 進行分類、統計與顯示轉換,適合進階資料查詢與資料轉換應用。
- `CASE WHEN` 的使用情境與技巧
理論
CASE WHEN
語句允許你在 SQL 查詢中實現條件邏輯。它根據你設定的條件,返回一個或多個可能的結果值中的一個。這就像程式語言中的 if-else 或 switch 語句,但在 SQL 中用於數據查詢和轉換。
CASE WHEN
非常常用於:
- 數據分類: 根據數值範圍或其他標準將數據分組或標記。
- 條件匯總: 在聚合函數 (如 SUM, COUNT) 中根據條件進行計算。
- 顯示轉換: 將資料庫中儲存的代碼或標識轉換為更具可讀性的文字描述。
實例
假設我們有一個 students
表 (id, name, score)。我們可以使用 CASE WHEN
根據分數來判斷學生的等級:
SELECT name, score,\n CASE\n WHEN score >= 90 THEN 'A'\n WHEN score >= 80 THEN 'B'\n WHEN score >= 70 THEN 'C'\n ELSE 'D'\n END AS grade\nFROM students;
另一個例子,計算不同等級的學生人數:
SELECT\n CASE\n WHEN score >= 90 THEN 'A'\n WHEN score >= 80 THEN 'B'\n WHEN score >= 70 THEN 'C'\n ELSE 'D'\n END AS grade,\n COUNT(*)\nFROM students\nGROUP BY\n CASE\n WHEN score >= 90 THEN 'A'\n WHEN score >= 80 THEN 'B'\n WHEN score >= 70 THEN 'C'\n ELSE 'D'\n END;
語法
CASE
語句有兩種基本形式:
簡單 CASE 語句
用於比較一個表達式與一系列值:
CASE expression\n WHEN value1 THEN result1\n WHEN value2 THEN result2\n ...\n [ELSE else_result]\nEND\n
搜索 CASE 語句
用於評估一系列布林表達式:
CASE\n WHEN condition1 THEN result1\n WHEN condition2 THEN result2\n ...\n [ELSE else_result]\nEND\n
WHEN condition THEN result
: 當condition
為真時,返回result
。ELSE else_result
: 如果沒有任何WHEN
條件為真,則返回else_result
。如果省略ELSE
且沒有條件為真,則返回 NULL。END
: 結束CASE
語句。
圖解
可以將 CASE WHEN
想像成一個決策樹:
+-----------------+
| 開始 |
+-----------------+
|
v
+-----------------+
| 評估第一個條件 |
| (condition1) |
+-----------------+
|
Yes / \ No
/ \
v v
+----------+ +-----------------+
| 返回結果1| | 評估第二個條件 |
| (result1)| | (condition2) |
+----------+ +-----------------+
... (更多 WHEN) ...
|
Yes / \ No
/ \
v v
+----------+ +----------+
| 返回結果N| | 返回 ELSE|
|(resultN) | | (else_result)|
+----------+ +----------+
\ /
\ /
\ /
v
+----------+
| 結束 |
+----------+
常見問題
- 為什麼要用
ELSE
? 為了確保在所有WHEN
條件都不滿足時,語句有一個預設的返回值,避免返回 NULL(除非這是你期望的)。 - 條件的順序重要嗎? 是的,
CASE
語句會按順序評估WHEN
條件,一旦找到第一個為真的條件,就會返回對應的結果並停止評估後續條件。 - 可以在
GROUP BY
或ORDER BY
中使用CASE
嗎? 可以。這允許你根據條件對數據進行分組或排序。
小練習
假設有一個 products
表 (product_id, product_name, price)。
- 使用
CASE WHEN
根據價格將商品分為 ‘便宜’ ( price < 100), ‘中等’ (100 <= price < 500), ‘昂貴’ (price >= 500)。 - 統計不同價格區間的商品數量。
互動式 SQL 練習:CASE WHEN
你可以在這裡輸入並模擬執行包含 CASE WHEN
的 SQL 語句。
員工表(employees)
id | name | salary |
---|---|---|
1 | Alice | 60000 |
2 | Bob | 85000 |
3 | Charlie | 45000 |
4 | David | 100000 |