SELECT CASE 語句的用法


在 MySQL 中,CASE 語句是一種非常靈活的條件式運算子,可用於在 SELECT 查詢中實現條件邏輯。CASE 可以在資料選取時提供類似於「如果這樣,則那樣」的邏輯判斷,來根據某些條件改變顯示的結果。CASE 語句可以用在 SELECT 列表、WHERE 子句、ORDER BY 子句中,以及其他可以進行運算的地方。

CASE 語句有兩種基本形式:簡單 CASE 和搜尋 CASE。

簡單 CASE : 

CASE 表達式
     WHEN 值1 THEN 結果1
     WHEN 值2 THEN 結果2
     ...
     ELSE 預設結果
END

以上的語法,CASE 會將表達式的結果與每個 WHEN 子句中的值進行比較,如果相等,則返回對應的 THEN 中的結果。

假設有一個名為 orders 的資料表,其中包含訂單的狀態代碼,每個代碼都代表不同的訂單狀態。下表列出了可能的狀態代碼及其意義:

1 : 已下訂
2 : 運送中
3 : 已送達
4 : 已取消

如果想在查詢結果中將這些狀態代碼轉換為更具可讀性的狀態描述,可以使用簡單的 CASE 語句來實現:

SELECT order_id,
CASE status
     WHEN 1 THEN '已下訂'
     WHEN 2 THEN '運送中'
     WHEN 3 THEN '已送達'
     WHEN 4 THEN '已取消'
     ELSE '未知狀態'
END AS 訂單狀態
FROM orders;

在以上這個例子中,CASE 語句檢查 status 欄位的值,並根據該值返回對應的狀態描述。如果 status 的值不是 1、2、3 或 4 中的任何一個,CASE 語句將返回 '未知狀態' 作為預設情況。每個訂單的 order_id 和計算後的訂單狀態,將會在查詢結果中顯示,這樣查詢結果就更容易理解和閱讀了。


搜尋 CASE : 

CASE
     WHEN 條件1 THEN 結果1
     WHEN 條件2 THEN 結果2
     ...
     ELSE 預設結果
END

以上的語法,在搜尋 CASE 形式中,每個 WHEN 子句包含一個布林條件,當條件為真時,返回對應的 THEN 中的結果。

搜尋 CASE 語句在 MySQL 中用於基於一組較複雜的條件來變更查詢結果的輸出,而不僅僅是基於單一欄位的值。

這裡提供一個使用搜尋 CASE 語句的範例: 

假設有一個名為 employees 的資料表,包含員工的姓名(name)、部門(department)和月薪(salary)。我們想要根據員工的部門和薪資來給予他們不同的評級。 

範例查詢如下:

SELECT name, department, salary,
CASE
    WHEN department = 'IT' AND salary >= 8000 THEN 'A級'
    WHEN department = 'IT' AND salary < 8000 THEN 'B級'
    WHEN department = 'HR' AND salary >= 6000 THEN 'A級'
    WHEN department = 'HR' AND salary < 6000 THEN 'B級'
    ELSE '未評級'
END AS 評級
FROM employees;

在以上這個例子中,搜尋 CASE 語句根據每位員工的部門和薪資來決定他們的評級: 
如果員工在 IT 部門,且月薪大於或等於 8000,則評為「A級」。 
如果員工在 IT 部門,但月薪低於 8000,則評為「B級」。 
如果員工在 HR 部門,且月薪大於或等於 6000,則同樣評為「A級」。 
如果員工在 HR 部門,但月薪低於 6000,則評為「B級」。 
如果員工不符合上述任何條件,則評為「未評級」。 

這樣的查詢可以幫助管理層快速識別不同部門中根據薪資水準的員工評級,便於進行人力資源規劃和管理決策。

在 SQL 查詢中,SELECT CASE 語句可以與 WHERE 和 HAVING 子句一起使用來進行更複雜的數據篩選和分組後的條件過濾。

以下是如何在查詢中結合使用這些元素的基本概念: 

與 WHERE 子句一起使用 


WHERE 子句用於過濾選擇的行,其條件是在選擇列的數據之前進行評估的。當你想要先過濾數據,然後對這些過濾後的結果應用 CASE 語句時,可以使用 WHERE。 

範例: 假設我們有一個 employees 表,包含 id、name、department 和 salary 欄位,我們想要選擇 IT 部門的員工,並根據他們的薪水給予評級:

SELECT id, name, department, salary,
CASE
     WHEN salary > 10000 THEN '高級'
     WHEN salary > 5000 THEN '中級'
     ELSE '初級'
END AS 評級
FROM employees
WHERE department = 'IT';

這個查詢首先通過 WHERE 子句過濾出 IT 部門的員工,然後對這些過濾後的結果應用 CASE 語句來給予不同的評級。

與 HAVING 子句一起使用


HAVING 子句用於過濾分組後的結果集,與 WHERE 子句不同,HAVING 是在數據分組和聚合函數計算之後進行過濾的。當你需要根據聚合結果來過濾分組時,可以使用 HAVING。 

範例: 假設在上面的 employees 表中,我們想要找出平均薪水超過一定值的部門,並對這些部門進行分組顯示其平均薪水:

SELECT department,
       AVG(salary) AS 平均薪水,
       CASE
           WHEN AVG(salary) > 10000 THEN '高薪部門'
           WHEN AVG(salary) > 5000 THEN '中等薪資部門'
           ELSE '普通薪資部門'
       END AS 部門評級
FROM employees
GROUP BY department
HAVING AVG(salary) > 6000;

這個查詢首先根據部門對員工進行分組並計算每個部門的平均薪水,然後使用 HAVING 子句過濾出平均薪水超過 6000 的部門。對於這些滿足條件的部門,查詢使用 CASE 語句來給予不同的評級。

關於Where與Having 若有疑問,可以參考 "SQL語法中WHERE與HAVING有何差異?"

張貼留言

0 留言