SQL CASE 表示式

摘要:在本教程中,您將學習如何使用 SQL CASE 表示式為 SQL 語句新增 if-else 邏輯。

SQL CASE 表示式簡介 #

CASE 表示式允許您向查詢中新增 if-else 邏輯,使其功能更強大。CASE 表示式有兩種形式:

  • 簡單 CASE 表示式。
  • 搜尋 CASE 表示式。

SQL 允許您在任何可以使用表示式的地方使用 CASE 表示式。例如,您可以在 SELECTDELETEUPDATE 語句的 SELECTORDER BYHAVING 等子句中使用 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_1when_expression_2when_expression_3 等)進行比較。

如果 expressionWHEN 子句中相應的表示式匹配,CASE 語句將返回 result_1result_2result_3

如果 expressionWHEN 子句中的任何表示式都不匹配,它將返回 ELSE 子句中的 else_result

ELSE 子句是可選的。如果您省略 ELSE 子句,並且表示式與 WHEN 子句中的任何表示式都不匹配,則 CASE 表示式將返回 NULL

簡單 CASE 表示式示例 #

讓我們看一下 employees 表。

employees_table

以下語句使用簡單 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)

在此示例中:

  • 如果薪水小於 3000CASE 表示式返回“Low”(低)。
  • 如果薪水在 30005000 之間,它返回“Medium”(中)。
  • 當薪水大於 5000 時,CASE 表示式返回“High”(高)。

摘要 #

  • 使用 CASE 表示式為您的查詢新增 if-else 邏輯。
  • 使用簡單 CASE 表示式來評估一個表示式。
  • 使用搜索 CASE 表示式來評估多個表示式。

資料庫 #

測驗 #

本教程是否有幫助?
© .