SQL CASE WHEN語法詳細教學與實用範例全解析

作者:帆軟行業化團隊

2025年7月02日 · 14 min read

來源:帆軟
sql case when
Image Source: unsplash

你常常需要根據不同條件,讓查詢結果出現不同內容嗎?sqlcasewhen語法就像程式中的if-then-else。你可以用它來分類成績、轉換性別顯示或分組統計。這個語法讓你在查詢時,輕鬆依照需求動態改變欄位值。你會發現,sqlcasewhen語法在資料處理上非常重要。

核心要點

  • SQL CASE WHEN語法能根據不同條件動態改變查詢結果,像程式中的if-then-else,適合分類、統計和資料轉換。
  • CASE WHEN有簡單CASE和搜尋CASE兩種格式,搜尋CASE更靈活,適合複雜條件判斷,建議多使用。
  • 結合聚合函數如SUM、COUNT,CASE WHEN可實現多條件統計與分組,提升資料分析效率。
  • 使用CASE WHEN時要注意條件判斷順序,建議加上ELSE避免回傳NULL,並避免過度巢狀以維持查詢可讀性。
  • CASE WHEN可用於查詢、更新等多種場景,搭配索引與預先計算能提升效能,實務中多練習能快速掌握技巧。

sqlcasewhen語法

3e735c34710f41458c0510281b7503a2.webp
sqlcasewhen語法

用途

你在資料查詢時,常常需要根據不同條件給出不同的結果。sqlcasewhen語法就是為這個目的而設計。它讓你可以像寫if-then-else一樣,根據條件動態決定欄位值。這種語法在資料分類、分組統計、欄位轉換、資料清洗等場景都很常見。

sqlcasewhen語法的邏輯結構,和Excel或Google Sheet裡的IF函數非常相似。你可以用它來根據條件回傳不同結果,這和程式語言中的if-then-else結構幾乎一樣。

你可以用sqlcasewhen語法完成很多資料處理任務,例如:

1. 分類成績等級,根據分數自動標註「優秀」、「及格」或「不及格」

2. 統計男女同學人數,或計算不同條件下的通過人數。

3. 將行資料轉成多個欄位,像是把不同能源類型的數值分開統計。

這些應用證明,sqlcasewhen語法能在條件分類、數據統計及數據轉換等多種場景中達到預期效果。

結構

sqlcasewhen語法有兩種主要格式:簡單CASE和搜尋CASE。你可以根據需求選擇適合的寫法。

1. 簡單CASE格式

這種格式適合你要比對某個欄位的值時使用。語法如下:

CASE 欄位名稱
    WHEN 值1 THEN 結果1
    WHEN 值2 THEN 結果2
    ...
    ELSE 預設結果
END

2. 搜尋CASE格式

這種格式彈性更高,適合你要根據多個條件判斷時使用。語法如下:

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

建議你多使用搜尋CASE格式,因為它可以處理更複雜的條件判斷,寫法也更直觀。

3. 實用範例

以下是幾個常見的sqlcasewhen語法範例:

  • 成績分級與NULL處理

    SELECT STUDENT_NAME,
    CASE 
        WHEN score < 60 THEN '不及格'
        WHEN score >= 60 AND score < 80 THEN '及格'
        WHEN score >= 80 THEN '優秀'
        WHEN score IS NULL THEN '缺席考試'
        ELSE '異常' 
    END AS REMARK
    FROM TABLE
    
  • 條件統計

    SELECT
    SUM(CASE WHEN STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_COUNT,
    SUM(CASE WHEN STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_COUNT,
    SUM(CASE WHEN STU_SCORE >= 60 AND STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_PASS,
    SUM(CASE WHEN STU_SCORE >= 60 AND STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_PASS
    FROM THTF_STUDENTS
    
  • 行轉列應用

    SELECT E_CODE,
    SUM(CASE WHEN E_TYPE = 0 THEN E_VALUE ELSE 0 END) AS WATER_ENERGY,
    SUM(CASE WHEN E_TYPE = 1 THEN E_VALUE ELSE 0 END) AS ELE_ENERGY,
    SUM(CASE WHEN E_TYPE = 2 THEN E_VALUE ELSE 0 END) AS HEAT_ENERGY
    FROM THTF_ENERGY_TEST
    GROUP BY E_CODE
    

注意事項

你在使用sqlcasewhen語法時,請特別注意以下幾點:

  • sqlcasewhen語法會從上到下依序判斷條件,只要第一個條件成立就停止判斷並回傳結果。這和流程控制語句很像。
  • 如果所有條件都不成立,系統會回傳ELSE後的結果。如果沒有寫ELSE,則會回傳NULL。
  • 你可以搭配NULLIF、COALESCE等函數處理NULL值,讓查詢結果更完整。
  • sqlcasewhen語法和IF語法不同,IF通常只能判斷單一條件,而CASE WHEN可以處理多重條件,彈性更高。
  • 建議你多用搜尋CASE格式,這樣可以讓SQL更容易維護,也能應對複雜的業務邏輯。

小提醒:CASE WHEN語法可以巢狀使用,但建議不要過度巢狀,避免查詢難以閱讀與維護。

應用場景

應用場景
應用場景

分類

你可以用sqlcasewhen語法快速將資料分類。舉例來說,當你有一份學生分數表,你想根據分數自動標註等級。你可以這樣寫:

SELECT STUDENT_NAME,
  CASE 
    WHEN SCORE >= 80 THEN '優秀'
    WHEN SCORE >= 60 THEN '及格'
    ELSE '不及格'
  END AS 等級
FROM STUDENTS

這樣查詢後,你會看到每位學生的分數旁邊多了一個「等級」欄位。這種分類方式讓你一眼就能看出學生表現。

統計

你常常需要統計不同條件下的人數或數量。你可以用CASE WHEN結合SUM來達到這個目的。例如,你想知道男生和女生各有多少人:

SELECT
  SUM(CASE WHEN GENDER = '男' THEN 1 ELSE 0 END) AS 男生人數,
  SUM(CASE WHEN GENDER = '女' THEN 1 ELSE 0 END) AS 女生人數
FROM STUDENTS

這種寫法讓你不用多次查詢,就能一次得到所有統計結果。當你面對大量資料時,建議你先將每日或每月的分組統計結果預先計算並存入資料表。這樣查詢時只需讀取這些資料,查詢速度會大幅提升。

行轉列

你有時會遇到需要將行資料轉成多個欄位的情境。舉例來說,你有一份能源消耗紀錄表,想把不同能源類型分開顯示。你可以這樣寫:

SELECT
  E_CODE,
  SUM(CASE WHEN E_TYPE = 0 THEN E_VALUE ELSE 0 END) AS 水能,
  SUM(CASE WHEN E_TYPE = 1 THEN E_VALUE ELSE 0 END) AS 電能,
  SUM(CASE WHEN E_TYPE = 2 THEN E_VALUE ELSE 0 END) AS 熱能
FROM ENERGY
GROUP BY E_CODE

這樣查詢後,每一種能源都會變成一個獨立欄位,讓你更容易分析。

聚合

你可以將sqlcasewhen語法和聚合函數(如SUM、COUNT)結合,針對不同條件進行加總或計數。例如,你想知道及格和不及格人數:

SELECT
  COUNT(CASE WHEN SCORE >= 60 THEN 1 END) AS 及格人數,
  COUNT(CASE WHEN SCORE < 60 THEN 1 END) AS 不及格人數
FROM STUDENTS

當你需要處理複雜的分組與聚合時,可以考慮建立具體化檢視(materialized view)。這樣你可以將多表JOIN與分組聚合計算預先執行並儲存,查詢時直接讀取結果,查詢效能會大幅提升。

更新

你也可以用CASE WHEN語法進行條件更新。假設你想根據分數自動更新學生的等級欄位,可以這樣寫:

UPDATE STUDENTS
SET 等級 = CASE
  WHEN SCORE >= 80 THEN '優秀'
  WHEN SCORE >= 60 THEN '及格'
  ELSE '不及格'
END

這樣你只需執行一次指令,就能根據條件批次更新所有資料,省時又方便。

小提醒:你可以靈活運用sqlcasewhen語法,讓資料查詢和處理變得更有效率!

進階技巧

聚合函數

你可以把CASE WHEN和SUM、COUNT等聚合函數結合,讓統計更靈活。舉例來說,你有一份城市人口資料,想要統計各省的人口總和。你可以這樣寫:

SELECT
  CASE
    WHEN city IN ('長沙', '衡陽') THEN '湖南'
    WHEN city IN ('海口', '三亞') THEN '海南'
    ELSE '其他'
  END AS 省份,
  SUM(population) AS 人口總和
FROM city_population
GROUP BY
  CASE
    WHEN city IN ('長沙', '衡陽') THEN '湖南'
    WHEN city IN ('海口', '三亞') THEN '海南'
    ELSE '其他'
  END

這樣你就能根據城市自動分類,並計算每個省份的人口總和。這種技巧讓你能快速完成條件分類與統計。

子查詢

你可以把CASE WHEN放在子查詢裡,或和JOIN一起用。這樣可以解決更複雜的查詢需求。例如,你想查詢每個學生的成績等級,然後再統計每個等級的人數。你可以先用子查詢分類,再在外層統計:

SELECT 等級, COUNT(*) AS 人數
FROM (
  SELECT
    CASE
      WHEN score >= 80 THEN '優秀'
      WHEN score >= 60 THEN '及格'
      ELSE '不及格'
    END AS 等級
  FROM students
) t
GROUP BY 等級

這樣查詢結果會更清楚,也方便後續分析。

效能

你在寫CASE WHEN時,應該注意查詢效能。建議你:

  • 優先在WHERE或JOIN條件過濾資料,減少CASE WHEN判斷的資料量。
  • 避免在大量資料上巢狀CASE WHEN,這會讓查詢變慢。
  • 可以考慮建立索引,或將複雜查詢結果存成臨時表。

小提醒:你可以先用EXPLAIN分析查詢計畫,找出效能瓶頸。

錯誤排解

你在使用CASE WHEN時,常見錯誤有:

  • 條件重疊,導致結果不如預期。
  • 忘記寫ELSE,查詢結果出現NULL。
  • 資料有NULL值時,判斷式要加IS NULL處理。

你可以用COALESCE或NULLIF等函數,讓查詢結果更完整。遇到錯誤訊息時,建議你檢查語法、條件順序和資料內容,這樣能快速找到問題。

 

你已經學會CASE WHEN語法的彈性與強大功能。你可以從簡單的分類開始,慢慢挑戰更進階的應用。建議你多參考技術文章或SQL教學書籍,這些資源會幫助你理解語法結構與範例。不過,目前還沒有官方文件或統計數據案例。你可以多練習,並嘗試結合GROUP BY、JOIN等語法,讓資料處理更有效率。

小提醒:多做練習題,會讓你更快掌握CASE WHEN的各種用法!

FAQ

CASE WHEN可以用在WHERE條件嗎?

你不能直接在WHERE裡用CASE WHEN。不過,你可以用CASE WHEN產生欄位,再在外層查詢用WHERE過濾。

CASE WHEN和IF有什麼不同?

你用CASE WHEN可以判斷多個條件。IF通常只能判斷一個條件。CASE WHEN語法更靈活,適合複雜邏輯。

沒有寫ELSE會怎樣?

你如果沒寫ELSE,所有條件都不成立時,SQL會回傳NULL。建議你加上ELSE,避免出現預期外的NULL。

可以巢狀CASE WHEN嗎?

你可以在CASE WHEN裡再寫CASE WHEN。這樣可以處理更複雜的判斷。不過,巢狀太多會讓SQL難讀。

CASE WHEN會影響查詢效能嗎?

你在大量資料上用CASE WHEN,查詢速度可能會變慢。你可以先用WHERE過濾資料,或考慮建立索引。

帆軟產品免費試用

企業戰情室報表軟體

企業戰情室報表軟體

複雜報表/戰情室/資料填報/數位孿生

企業商業智慧BI軟體

企業商業智慧BI軟體

自助資料處理/Dashboard/探索分析

一站式資料整合平台

一站式資料整合平台

資料同步/ETL資料開發/API資料服務

免費資源下載

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

×

立即下載

姓名

郵箱

公司完整名稱

管道了解

-- 您是怎麽瞭解的我們 --

網路搜尋
Facebook臉書
媒體/部落格/論壇
YouTube
電子報
線下展會
線下課程
他人推薦
其他

職位

-- 選擇您的職稱 --

IT資訊&數據部門
一般部門
管理/ 決策者
老師
學生
其他

是否有報表/BI/數位建設需求?

-- 請選擇 --

沒有
不確定

手機號碼

SMS 驗證碼

我們很樂意傾聽你的需求,解答您的疑問,並提供專業建議, 助力您的企業實現智慧轉型!

×

意見回饋

姓名

電郵

公司

國家/地區

-- select an option --

電話

投訴原因

請選擇投訴原因

代理商問題
產品問題
技術支援服務問題
專案問題
銷售問題
商務問題
行銷問題
其他

投訴內容