SQL中的CASE語法:強大而靈活的條件表達式

在SQL中,CASE語法是一個非常實用且強大的工具。它允許我們在查詢中進行條件判斷,根據不同的情況返回不同的結果。本文將深入探討CASE語法的用法、優點以及實際應用場景。

CASE語法的基本結構

CASE語法有兩種基本形式:簡單CASE和搜索CASE。

簡單CASE語法

1
2
3
4
5
6
CASE 表達式
WHEN1 THEN 結果1
WHEN2 THEN 結果2
...
[ELSE 其他結果]
END

搜索CASE語法

1
2
3
4
5
6
CASE
WHEN 條件1 THEN 結果1
WHEN 條件2 THEN 結果2
...
[ELSE 其他結果]
END

CASE語法的優點

  1. 靈活性:可以處理複雜的條件邏輯
  2. 可讀性:使查詢更易於理解
  3. 效能:通常比使用多個IF語句更有效率
  4. 多功能性:可以在SELECT、WHERE、ORDER BY等子句中使用

實際應用場景

讓我們來看幾個CASE語法的實際應用例子:

例子1:根據成績分級

假設我們有一個包含學生成績的資料表,我們想要根據分數給出對應的等級:

1
2
3
4
5
6
7
8
9
10
11
SELECT 
學生姓名,
分數,
CASE
WHEN 分數 >= 90 THEN 'A'
WHEN 分數 >= 80 THEN 'B'
WHEN 分數 >= 70 THEN 'C'
WHEN 分數 >= 60 THEN 'D'
ELSE 'F'
END AS 等級
FROM 學生成績表;

例子2:根據部門計算不同的薪資增長

假設不同部門有不同的薪資增長率:

1
2
3
4
5
6
7
8
9
10
11
SELECT 
員工姓名,
部門,
目前薪資,
CASE 部門
WHEN '銷售' THEN 目前薪資 * 1.1
WHEN '技術' THEN 目前薪資 * 1.05
WHEN '行政' THEN 目前薪資 * 1.03
ELSE 目前薪資
END AS 調整後薪資
FROM 員工資料表;

例子3:在GROUP BY中使用CASE

CASE語法也可以用在GROUP BY子句中,實現更複雜的分組邏輯:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
CASE
WHEN 年齡 < 18 THEN '未成年'
WHEN 年齡 BETWEEN 18 AND 65 THEN '成年'
ELSE '銀髮族'
END AS 年齡組,
COUNT(*) AS 人數
FROM 客戶資料表
GROUP BY
CASE
WHEN 年齡 < 18 THEN '未成年'
WHEN 年齡 BETWEEN 18 AND 65 THEN '成年'
ELSE '銀髮族'
END;

CASE語法在UPDATE語句中的應用

除了在SELECT語句中使用CASE,我們也經常在UPDATE語句中運用CASE來實現條件更新。這允許我們根據不同的條件對資料進行更複雜的更新操作。

UPDATE語句中使用CASE的基本語法

1
2
3
4
5
6
7
8
UPDATE 資料表
SET 欄位 = CASE
WHEN 條件1 THEN1
WHEN 條件2 THEN2
...
ELSE 預設值
END
WHERE 條件;

實際應用例子

讓我們來看幾個在UPDATE語句中使用CASE的實際例子:

例子1:根據員工表現更新薪資

假設我們要根據員工的表現評級來更新他們的薪資:

1
2
3
4
5
6
7
UPDATE 員工資料表
SET 薪資 = CASE 表現評級
WHEN 'A' THEN 薪資 * 1.1
WHEN 'B' THEN 薪資 * 1.05
WHEN 'C' THEN 薪資 * 1.02
ELSE 薪資
END;

這個查詢會根據員工的表現評級來增加他們的薪資。A級員工加薪10%,B級5%,C級2%,其他保持不變。

例子2:根據庫存量更新產品狀態

假設我們要根據產品的庫存量來更新其狀態:

1
2
3
4
5
6
7
UPDATE 產品資料表
SET 狀態 = CASE
WHEN 庫存量 = 0 THEN '缺貨'
WHEN 庫存量 BETWEEN 1 AND 10 THEN '低庫存'
WHEN 庫存量 BETWEEN 11 AND 50 THEN '適中'
ELSE '充足'
END;

這個查詢會根據產品的庫存量自動更新產品狀態。

例子3:在單一UPDATE語句中更新多個欄位

CASE語法的一個強大功能是它允許我們在一個UPDATE語句中根據不同條件更新多個欄位:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
UPDATE 訂單資料表
SET
處理狀態 = CASE
WHEN 付款狀態 = '已付款' AND 運送狀態 = '已發貨' THEN '已完成'
WHEN 付款狀態 = '已付款' AND 運送狀態 = '準備中' THEN '處理中'
WHEN 付款狀態 = '未付款' THEN '等待付款'
ELSE '處理中'
END,
優先級 = CASE
WHEN 訂單金額 > 10000 THEN '高'
WHEN 訂單金額 BETWEEN 5000 AND 10000 THEN '中'
ELSE '低'
END
WHERE 訂單日期 = CURRENT_DATE;

這個查詢同時更新了訂單的處理狀態和優先級,基於不同的條件。

使用CASE進行UPDATE時的注意事項

  1. 效能考量:在大型資料表上使用複雜的CASE語句進行UPDATE可能會影響效能。在這種情況下,可以考慮分批處理或使用索引來優化。

  2. 資料一致性:確保CASE語句涵蓋了所有可能的情況,以避免意外的NULL值或錯誤的更新。

  3. 交易管理:在進行大規模或關鍵的更新時,建議使用交易(Transaction)來確保資料的一致性和可回溯性。

  4. 測試:在實際執行UPDATE之前,可以先使用SELECT語句和相同的CASE邏輯來預覽更新的結果,以確保更新的正確性。

結論

CASE語法不僅在SELECT語句中有廣泛應用,在UPDATE語句中也是一個強大的工具。它允許我們根據複雜的條件邏輯來更新資料,提高了資料操作的靈活性和效率。無論是在資料查詢還是更新中,靈活運用CASE語法都可以幫助我們更好地處理複雜的業務邏輯,提升SQL程式碼的表達能力和可維護性。