摘要:在本教程中,您將學習如何使用 SQL CASE 表示式為 SQL 語句新增 if-else 邏輯。
SQL CASE 表示式簡介 #
CASE 表示式允許您向查詢中新增 if-else 邏輯,使其功能更強大。CASE 表示式有兩種形式:
- 簡單
CASE表示式。 - 搜尋
CASE表示式。
SQL 允許您在任何可以使用表示式的地方使用 CASE 表示式。例如,您可以在 SELECT、DELETE 和 UPDATE 語句的 SELECT、ORDER BY 和 HAVING 等子句中使用 CASE 表示式。
簡單 CASE 表示式 #
以下是簡單 CASE 表示式的語法:
CASE expression
WHEN when_expression_1 THEN result_1
WHEN when_expression_2 THEN result_2
WHEN when_expression_3 THEN result_3
ELSE else_result
ENDCode language: SQL (Structured Query Language) (sql)CASE 表示式使用相等運算子 (=) 將一個表示式與一組表示式(when_expression_1、when_expression_2、when_expression_3 等)進行比較。
如果 expression 與 WHEN 子句中相應的表示式匹配,CASE 語句將返回 result_1、result_2 或 result_3。
如果 expression 與 WHEN 子句中的任何表示式都不匹配,它將返回 ELSE 子句中的 else_result。
ELSE 子句是可選的。如果您省略 ELSE 子句,並且表示式與 WHEN 子句中的任何表示式都不匹配,則 CASE 表示式將返回 NULL。
簡單 CASE 表示式示例 #
讓我們看一下 employees 表。

以下語句使用簡單 CASE 表示式來獲取員工在 2000 年的入職週年紀念:
SELECT
first_name,
last_name,
hire_date,
CASE 2000 - EXTRACT(YEAR FROM hire_date)
WHEN 1 THEN '1 year'
WHEN 3 THEN '3 years'
WHEN 5 THEN '5 years'
WHEN 10 THEN '10 years'
WHEN 15 THEN '15 years'
WHEN 20 THEN '20 years'
WHEN 25 THEN '25 years'
WHEN 30 THEN '30 years'
END anniversary
FROM
employees
ORDER BY
first_name;Code language: SQL (Structured Query Language) (sql) first_name | last_name | hire_date | anniversary
-------------+-------------+------------+------------
Adam | Fripp | 1997-04-10 | 3 years
Alexander | Hunold | 1990-01-03 | 10 years
Alexander | Khoo | 1995-05-18 | 5 years
Britney | Everett | 1997-03-03 | 3 years
Bruce | Ernst | 1991-05-21 | NULL
Charles | Johnson | 2000-01-04 | NULL
Daniel | Faviet | 1994-08-16 | NULL
...Code language: SQL (Structured Query Language) (sql)EXTRACT 函式從入職日期中提取年份。以下表達式將 2000 年減去入職年份,以獲取員工到 2000 年為止為公司工作的總年數:
2000 - EXTRACT(YEAR FROM hire_date)Code language: SQL (Structured Query Language) (sql)CASE 表示式將服務年限與 1、3、5、10、15、20、25 和 30 進行比較。
如果服務年限等於這些數字之一,它將返回員工的入職週年紀念。否則,它返回 NULL。
要檢索在 2000 年有入職週年紀念的員工,您可以從結果集中篩選掉 NULL:
WITH work_anniversary_employees AS (
SELECT
first_name,
last_name,
hire_date,
CASE (2000 - EXTRACT(YEAR FROM hire_date))
WHEN 1 THEN '1 year'
WHEN 3 THEN '3 years'
WHEN 5 THEN '5 years'
WHEN 10 THEN '10 years'
WHEN 15 THEN '15 years'
WHEN 20 THEN '20 years'
WHEN 25 THEN '25 years'
WHEN 30 THEN '30 years'
END anniversary
FROM
employees
)
SELECT first_name, last_name, hire_date, anniversary
FROM work_anniversary_employees
WHERE anniversary IS NOT NULL;Code language: SQL (Structured Query Language) (sql)輸出
first_name | last_name | hire_date | anniversary
------------+------------+------------+-------------
Alexander | Hunold | 1990-01-03 | 10 years
David | Austin | 1997-06-25 | 3 years
Diana | Lorentz | 1999-02-07 | 1 year
John | Chen | 1997-09-28 | 3 years
Ismael | Sciarra | 1997-09-30 | 3 years
Luis | Popp | 1999-12-07 | 1 year
...Code language: SQL (Structured Query Language) (sql)搜尋 CASE 表示式 #
以下是搜尋 CASE 表示式的語法:
CASE
WHEN boolean_expression_1 THEN result_1
WHEN boolean_expression_2 THEN result_2
WHEN boolean_expression_3 THEN result_3
ELSE else_result
END;Code language: SQL (Structured Query Language) (sql)在此語法中,CASE 表示式從上到下評估每個 WHEN 子句中的布林表示式。
如果表示式為 true,則搜尋 CASE 語句返回相應 THEN 子句中的結果。
如果沒有表示式的計算結果為 true,則 CASE 表示式返回 ELSE 子句中的 else_result。
與簡單 CASE 表示式一樣,ELSE 子句是可選的。如果省略它並且沒有布林表示式的計算結果為 true,則 CASE 表示式返回 NULL。
請注意,簡單 CASE 表示式評估一個布林表示式,而搜尋 CASE 表示式評估多個布林表示式。
搜尋 CASE 表示式示例 #
以下查詢使用搜索 CASE 表示式對員工的薪水進行評級:
SELECT
first_name,
last_name,
CASE
WHEN salary < 3000 THEN 'Low'
WHEN salary >= 3000 AND salary <= 5000 THEN 'Medium'
WHEN salary > 5000 THEN 'High'
END salary_ranking
FROM
employees
ORDER BY
first_name;Code language: SQL (Structured Query Language) (sql)輸出
first_name | last_name | salary_ranking
-------------+-------------+----------------
Adam | Fripp | High
Alexander | Hunold | High
Alexander | Khoo | Medium
Britney | Everett | Medium
Bruce | Ernst | High
Charles | Johnson | High
Daniel | Faviet | High
David | Austin | Medium
...Code language: SQL (Structured Query Language) (sql)在此示例中:
- 如果薪水小於
3000,CASE表示式返回“Low”(低)。 - 如果薪水在
3000和5000之間,它返回“Medium”(中)。 - 當薪水大於
5000時,CASE表示式返回“High”(高)。
摘要 #
- 使用
CASE表示式為您的查詢新增 if-else 邏輯。 - 使用簡單
CASE表示式來評估一個表示式。 - 使用搜索
CASE表示式來評估多個表示式。