文章

PostgreSQL - 第 20 天 - CASE 與條件邏輯

課程簡介

CASE 表達式可以根據條件返回不同的結果,是資料查詢中常用的條件控制工具。透過 CASE,可以實現條件篩選、分類、轉換等操作,使查詢結果更靈活且符合業務需求。


基本 CASE 語法

CASE 表達式通常在 SELECT 查詢中使用,根據條件返回不同的值,基本語法如下:

1
2
3
4
5
6
CASE 
    WHEN 條件1 THEN 結果1
    WHEN 條件2 THEN 結果2
    ...
    ELSE 預設結果
END
  • WHEN:設定條件。
  • THEN:在條件成立時,返回對應的結果。
  • ELSE:所有條件都不成立時的預設結果。

使用範例

1. 根據條件分類資料

假設有一個 students 資料表,包含學生的成績,我們可以根據分數給予不同等級的評價。

1
2
3
4
5
6
7
8
9
SELECT student_name,
       score,
       CASE 
           WHEN score >= 90 THEN '優秀'
           WHEN score >= 75 THEN '良好'
           WHEN score >= 60 THEN '及格'
           ELSE '不及格'
       END AS 評價
FROM students;

此查詢根據 score 欄位的值,將每位學生的分數評為「優秀」、「良好」、「及格」或「不及格」。


2. 依據條件計算折扣

假設有一個 orders 資料表,包含每筆訂單的總額,我們可以根據訂單總額給予不同的折扣。

1
2
3
4
5
6
7
8
SELECT order_id,
       total_amount,
       CASE 
           WHEN total_amount >= 1000 THEN total_amount * 0.9  -- 10% 折扣
           WHEN total_amount >= 500 THEN total_amount * 0.95  -- 5% 折扣
           ELSE total_amount  -- 無折扣
       END AS 折扣後金額
FROM orders;

此查詢根據 total_amount 欄位的值,對於不同的訂單總額應用不同的折扣比例。


嵌套 CASE 語法

CASE 語法中可以嵌套 CASE 表達式,用於更複雜的條件判斷。例如,根據季節和地區區分優惠活動。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT customer_id,
       region,
       season,
       CASE 
           WHEN season = '夏季' THEN
               CASE 
                   WHEN region = '北區' THEN '夏季北區優惠'
                   WHEN region = '南區' THEN '夏季南區優惠'
                   ELSE '夏季優惠'
               END
           WHEN season = '冬季' THEN
               CASE 
                   WHEN region = '北區' THEN '冬季北區優惠'
                   WHEN region = '南區' THEN '冬季南區優惠'
                   ELSE '冬季優惠'
               END
           ELSE '全年優惠'
       END AS 優惠活動
FROM promotions;

此查詢根據季節和地區,指定不同的優惠活動。


CASE 與聚合函數結合

CASE 表達式可以與聚合函數結合,以便根據條件進行分組計算。例如,統計 employees 資料表中每個部門的男性和女性員工數量。

1
2
3
4
5
SELECT department,
       COUNT(CASE WHEN gender = 'M' THEN 1 END) AS 男性員工數,
       COUNT(CASE WHEN gender = 'F' THEN 1 END) AS 女性員工數
FROM employees
GROUP BY department;

此查詢通過 CASE 表達式來計算每個部門的男性和女性員工數量。


CASEORDER BY 結合

ORDER BY 中使用 CASE 表達式,可以根據特定條件進行排序。例如,將 orders 資料表中的 VIP 客戶優先排序。

1
2
3
4
5
6
SELECT customer_id, order_date, vip_status
FROM orders
ORDER BY CASE 
             WHEN vip_status = 'Y' THEN 1
             ELSE 2
         END, order_date DESC;

此查詢首先按 VIP 客戶排序,然後依據訂單日期降序排列。


使用 CASE 進行條件篩選

CASE 表達式可以在 WHERE 中搭配進行條件篩選,達到更靈活的查詢效果。例如,篩選高消費 VIP 客戶。

1
2
3
4
5
6
SELECT customer_id, total_amount, vip_status
FROM orders
WHERE CASE 
          WHEN vip_status = 'Y' THEN total_amount > 500
          ELSE total_amount > 1000
      END;

此查詢會針對 VIP 客戶篩選總額大於 500 的訂單,其他客戶則篩選總額大於 1000 的訂單。


本日總結

今天我們學習了 PostgreSQL 中的 CASE 表達式及其條件邏輯運用。通過 CASE,我們能夠靈活地根據條件進行分類、轉換、篩選和排序,讓查詢結果更符合實際需求。明天,我們將探討 PostgreSQL 的權限管理。

本文章以 CC BY 4.0 授權