你常常需要根據不同條件,讓查詢結果出現不同內容嗎?sqlcasewhen語法就像程式中的if-then-else。你可以用它來分類成績、轉換性別顯示或分組統計。這個語法讓你在查詢時,輕鬆依照需求動態改變欄位值。你會發現,sqlcasewhen語法在資料處理上非常重要。
你在資料查詢時,常常需要根據不同條件給出不同的結果。sqlcasewhen語法就是為這個目的而設計。它讓你可以像寫if-then-else一樣,根據條件動態決定欄位值。這種語法在資料分類、分組統計、欄位轉換、資料清洗等場景都很常見。
sqlcasewhen語法的邏輯結構,和Excel或Google Sheet裡的IF函數非常相似。你可以用它來根據條件回傳不同結果,這和程式語言中的if-then-else結構幾乎一樣。
你可以用sqlcasewhen語法完成很多資料處理任務,例如:
1. 分類成績等級,根據分數自動標註「優秀」、「及格」或「不及格」。
2. 統計男女同學人數,或計算不同條件下的通過人數。
3. 將行資料轉成多個欄位,像是把不同能源類型的數值分開統計。
這些應用證明,sqlcasewhen語法能在條件分類、數據統計及數據轉換等多種場景中達到預期效果。
sqlcasewhen語法有兩種主要格式:簡單CASE和搜尋CASE。你可以根據需求選擇適合的寫法。
這種格式適合你要比對某個欄位的值時使用。語法如下:
CASE 欄位名稱
WHEN 值1 THEN 結果1
WHEN 值2 THEN 結果2
...
ELSE 預設結果
END
這種格式彈性更高,適合你要根據多個條件判斷時使用。語法如下:
CASE
WHEN 條件1 THEN 結果1
WHEN 條件2 THEN 結果2
...
ELSE 預設結果
END
建議你多使用搜尋CASE格式,因為它可以處理更複雜的條件判斷,寫法也更直觀。
以下是幾個常見的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語法時,請特別注意以下幾點:
小提醒: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時,應該注意查詢效能。建議你:
小提醒:你可以先用EXPLAIN分析查詢計畫,找出效能瓶頸。
你在使用CASE WHEN時,常見錯誤有:
你可以用COALESCE或NULLIF等函數,讓查詢結果更完整。遇到錯誤訊息時,建議你檢查語法、條件順序和資料內容,這樣能快速找到問題。
你已經學會CASE WHEN語法的彈性與強大功能。你可以從簡單的分類開始,慢慢挑戰更進階的應用。建議你多參考技術文章或SQL教學書籍,這些資源會幫助你理解語法結構與範例。不過,目前還沒有官方文件或統計數據案例。你可以多練習,並嘗試結合GROUP BY、JOIN等語法,讓資料處理更有效率。
小提醒:多做練習題,會讓你更快掌握CASE WHEN的各種用法!
你不能直接在WHERE裡用CASE WHEN。不過,你可以用CASE WHEN產生欄位,再在外層查詢用WHERE過濾。
你用CASE WHEN可以判斷多個條件。IF通常只能判斷一個條件。CASE WHEN語法更靈活,適合複雜邏輯。
你如果沒寫ELSE,所有條件都不成立時,SQL會回傳NULL。建議你加上ELSE,避免出現預期外的NULL。
你可以在CASE WHEN裡再寫CASE WHEN。這樣可以處理更複雜的判斷。不過,巢狀太多會讓SQL難讀。
你在大量資料上用CASE WHEN,查詢速度可能會變慢。你可以先用WHERE過濾資料,或考慮建立索引。
免費資源下載