# SQL 中使用 CASE 與 IF 語句的 if else if 邏輯實用指南

> 掌握 SQL 中的 if-else-if 邏輯。本指南透過實際範例，說明如何運用 CASE 和 IF 來轉換 MySQL 和 SQL Server 中的資料。

Source: https://www.electe.net/tc/post/if-else-if-in-sql

Site guide: https://www.electe.net/tc/llms.txt

許多習慣其他程式語言的人,常會問如何在 SQL 中複製經典的 `IF ELSE IF` 指令。答案是:SQL 並沒有這個名稱的直接指令,但它提供了更強大、更優雅的解決方案:**CASE WHEN** 表達式。這是處理查詢中多重條件的標準通用做法。除了 `CASE` 之外,一些方言如 T-SQL 和 MySQL 也提供更簡潔的捷徑,例如 `IIF()` 和 `IF()`,適用於較簡單的情況。

## 為什麼條件邏輯是 SQL 中的超能力

試想一下，您需要將客戶按消費金額區分群組、根據緊急程度為支援工單設定不同優先級，或是依據季節性為產品標記分類。您肯定希望直接在資料庫中完成這些操作，而不必將資料匯出並在其他地方處理，對吧？

這正是 SQL 中條件邏輯的強大之處。正是這行程式碼，將單純的資料擷取轉化為真正的商業分析。

精通 SQL 中的「if else if」邏輯，是區分「僅查詢資料者」與「讓資料說話者」的關鍵能力。在本指南中，我們將向您展示如何將查詢從單純的記錄清單，轉變為動態分析工具。

與其先擷取原始資料再交由 Excel 或 Python 處理，您將學會：

- **直接在資料庫層級建立複雜的洞察**,加快你的流程速度。
- **撰寫更乾淨的 SQL 程式碼**,更易讀且效率驚人地提升。
- **用單一、強大的指令**取得完整的答案。

條件邏輯讓您能將商業智慧直接融入查詢中。您無需在後續階段計算指標，而是能在擷取資料的同時建立這些指標。這使得您的分析更快速、更具可重複性，並能與決策流程無縫整合。

閱讀完這份指南後，您將能夠將數據轉化為決策，並充分發揮資料庫的潛力。像 ELECTE 這樣的平台——這是一款專為中小企業設計的 AI 驅動型數據分析平台——正是運用這些原則來自動化報表生成，將複雜的查詢轉化為直觀的視覺化圖表，從而引導商業決策。

如果你的邏輯不只是簡單的「如果發生這個,就做那個」,那麼 **CASE** 表達式將成為你在 SQL 中最強大且可靠的工具。這並非某個方言特有的技巧,而是處理多重條件的 ANSI-SQL 標準做法。這意味著你的程式碼幾乎在任何地方都能運作,從 PostgreSQL 到 SQL Server 皆適用。

把 `CASE` 想像成直接嵌入查詢中的決策樹。與其將複雜的 `IF` 一層層嵌套,製造出很快就難以閱讀、維護起來如同噩夢的程式碼,`CASE` 讓你能以乾淨、循序的方式列出一系列條件。

### 簡單案例 vs 搜尋案例

`CASE` 表達式有兩種形式,各自針對特定情境設計。

- **Simple CASE:** 當你需要對單一欄位進行直接的相等比較時,這是完美的選擇。語法簡潔明瞭,非常適合用來對應精確的數值,例如將數字狀態代碼(1、2、3)轉換成文字標籤(「啟用」、「停用」、「暫停」)。
- **Searched CASE:** 這裡你擁有最大的靈活性。每個 `WHEN` 條件都是獨立的布林表達式。你可以使用多個欄位、邏輯運算子如 `AND` 和 `OR`,以及複雜的比較(`>`、`<`、`<>`)。這正是 **SQL 中 if-else if** 邏輯的真正體現。

實務上,你 90% 的時間都會使用 `Searched CASE`。它是能讓你將複雜商業規則──例如根據消費金額_及_購買頻率來區隔客戶──直接轉譯進查詢中的工具。

### 主要 SQL 方言的實例

讓我們來看看如何使用 `Searched CASE` 完成一項經典任務:依價格為產品分類。你會注意到,主要方言之間的語法幾乎完全相同,再次證明了它驚人的可攜性。

**MySQL/PostgreSQL/SQL Server 範例:**

`SELECTnome_prodotto,prezzo,CASEWHEN prezzo > 1000 THEN 'Premium'WHEN prezzo > 100 AND prezzo <= 1000 THEN 'Fascia Media'ELSE 'Economico'END AS categoria_prezzoFROM Prodotti;`

這段程式碼做了什麼?它會分析 `Prodotti` 資料表的每一列。如果 `prezzo`(價格)超過 1000,就標記為「Premium」。如果不是,則往下檢查下一個條件:是否介於 100 到 1000 之間,若是就標記為「Fascia Media」(中價位)。如果兩個條件都不成立,`ELSE` 子句就會發揮安全網的作用,標記為「Economico」(經濟型)。

`CASE` 的採用率在義大利 IT 產業中大幅成長。一項市場分析顯示,2020 年至 2025 年間,中小企業使用 `CASE` 的複雜查詢增加了 **45%**。ASSINT 於 2023 年發布的一份報告更顯示,**68%** 的義大利開發者偏好使用 `CASE`,因為相較於更繁瑣的替代邏輯,它能將錯誤率降低 **32%**。即使在我們的 AI 驅動資料分析平台 Electe 中,這些結構也是自動化報表的關鍵,為我們的客戶減少了 60% 的處理時間。

但學會使用 `CASE` 不僅限於 `SELECT`。你還可以將它整合進 `WHERE`、`ORDER BY`,甚至 `GROUP BY` 等子句中,建立動態的篩選、排序與彙總,讓你的查詢更加智慧且靈活。如果你想深入了解,建議參考我們的[SQL CASE WHEN 詳細指南](https://www.electe.net/post/case-when-sql)。

為了協助您編寫能在不同資料庫上順暢運作的程式碼，我們整理了一份表格，概述了最常見的 SQL 方言之間那些細微卻至關重要的語法差異。

### 主要 SQL 方言中 CASE 語法之比較

特性MySQLSQL ServerPostgreSQLSearched CASE(`CASE WHEN ... END`)支援支援支援Simple CASE(`CASE col WHEN ... END`)支援支援支援替代二元函式`IF(cond, 真, 假)IIF(cond, 真, 假)`不支援,使用 `CASETHEN`/`ELSE` 分支的類型處理寬鬆,自動強制轉型嚴格,類型須相同或可隱式轉換嚴格,類型必須相容省略 `ELSE` 子句回傳 `NULL`回傳 `NULL`回傳 `NULL`

三種資料庫——**MySQL**、**SQL Server (T-SQL)** 和 **PostgreSQL**——皆支援 Searched CASE(搜尋式 CASE)和 Simple CASE(簡單式 CASE),並使用相同的標準語法:`CASE WHEN ... END`。

關於**替代函數**方面，MySQL 提供 `IF(cond, true, false)`，而 SQL Server 則有 `IIF(cond, true, false)`。PostgreSQL 沒有與 `IIF` 直接對應的函數，任何情況下都必須使用 `CASE`。

在**型別處理**方面，MySQL 是三者中最寬鬆的。SQL Server 則較為嚴格：`THEN` 和 `ELSE` 分支中的所有結果必須是相同的資料型別，或可隱式轉換。PostgreSQL 同樣嚴格，要求 `CASE` 所有分支之間的資料型別相容。

如您所見，其基本語法既紮實又標準化。差異主要體現在替代功能與資料型別的處理上，這一點在編寫將於異質系統上執行的查詢時，絕不可輕忽。若能留意這些細微差異，將能為您省去不少麻煩。

## 針對簡單的二元條件，請選擇 IF 和 IIF

沒錯，`CASE` 表達式是處理複雜邏輯的萬用工具，但當面對的只是簡單的二選一情況時該怎麼辦？針對這種純粹的「if-else」場景，某些 SQL 方言提供了更直接、更精簡的替代方案。

把它們想像成捷徑。與其為了處理兩種結果就搭建一整套 `CASE` 區塊，不如使用單一函數，讓程式碼更精簡，說實話，也更容易一眼看懂。

### MySQL 中的 IF 函數

**MySQL** 提供了 `IF()` 函數，它完全做到了名副其實：接受三個參數，不多不少。

1. 要驗證的條件。
2. 條件為真時要回傳的值。
3. 條件為假時要回傳的值。

語法非常簡潔：`IF(條件, 為真時的值, 為假時的值)`。

來看一個實際例子。你想根據使用者最後登入日期，快速將平台上的使用者標記為「活躍」或「非活躍」。用 `IF`，一步到位：

`SELECTnome_utente,IF(last_login > '2023-01-01', 'Attivo', 'Inattivo') AS stato_utenteFROM Utenti;`

毫無疑問，這比等效的 `CASE` 更為簡潔。事實上，業界數據也證明了這點：自 2019 年以來，義大利中型企業使用 `IF(condition, true, false)` 的比例增長了 **52%**。

若想深入了解，可以參考[更多關於 SQL 條件表達式的詳細資訊](https://support.workiva.com/hc/it/articles/360042533552-Espressioni-condizionali-SQL)。

### SQL Server 中的 IIF 函數

**SQL Server** 也不甘示弱，提供了幾乎相同的函數：`IIF()`（意為 _Immediate IF_）。其運作方式與 MySQL 的 `IF()` 完全一致，邏輯相同，語法也相同。

因此，延續剛才的例子，針對 SQL Server，我們將寫下：

`SELECTnome_utente,IIF(last_login > '2023-01-01', 'Attivo', 'Inattivo') AS stato_utenteFROM Utenti;`

這張資訊圖能幫助你視覺化理解，根據所需比較的類型，如何在 `Simple CASE` 與 `Searched CASE` 之間做出決策。

核心概念很簡單：如果你要檢查單一數值是否相等，`Simple CASE` 更為簡潔。若是其他任何邏輯，`Searched CASE` 才是正確選擇。

**何時該使用 IF/IIF？**對於清晰簡單的二元條件，儘管放心使用。但要注意：一旦你的邏輯開始需要「elseif」，就該立刻回頭使用 `CASE`。這始終是保持程式碼易讀、長期易於維護的最佳選擇。

了解每種方言的這些特定替代方案，能讓你編寫出的程式碼不僅正確，更能針對你所使用的平台進行最佳化。這正是強大功能與簡易性之間的完美平衡。

## 實踐條件邏輯：來自現實世界的例子

當 SQL 條件表達式應用於實際商業問題時，其真正的威力才會顯現出來。這正是理論轉化為行動的時刻。讓我們看看 `IF`、`ELSE`，尤其是 `CASE WHEN`，如何從單純的指令搖身一變，成為能夠直接在資料庫中將原始資料轉化為策略性洞見的強大工具。

我們將分析每位數據分析師或開發人員遲早都會遇到的四種情境，涵蓋行銷到資料管理各個層面，展示一個結構良好的 `CASE WHEN` 如何能自動化複雜任務並提供即時解答。

### 客戶動態分群

想像你想要為客戶分類，以推出更有效的行銷活動。傳統做法是什麼？把所有資料匯出到試算表，然後開始擺弄公式和篩選條件。但其實有個更聰明的方法：直接在 `SELECT` 查詢中建立動態區隔。

此技術可讓您根據每位客戶的購買行為（例如總消費金額或最近一次訂單日期）為其進行標籤分類。這是一種極其有效的方法，能讓您一眼辨識出最佳客戶、忠實客戶，以及那些可能流失的客戶。

**實際範例：**

`SELECTID_Cliente,Nome,Spesa_Totale,Ultimo_Acquisto,CASEWHEN Spesa_Totale > 5000 AND Ultimo_Acquisto >= '2023-10-01' THEN 'Cliente Premium'WHEN Spesa_Totale > 1000 THEN 'Cliente Fedele'WHEN Ultimo_Acquisto < '2023-01-01' THEN 'Cliente a Rischio'ELSE 'Cliente Occasionale'END AS Segmento_ClienteFROM Clienti;`

只需一則查詢，你的資料就能獲得對行銷策略和客戶留存至關重要的脈絡資訊。這正是建構[關聯式資料庫範例](https://www.electe.net/post/esempio-di-database)的核心要素之一，讓它真正對業務有用，而不只是一個資料存放庫。

### 資料清理與標準化

資料品質就是一切。沒有乾淨的資料，任何分析都可能出錯。遺憾的是，手動輸入的資料往往一團糟：不一致、充滿打字錯誤，或格式各異。在 `UPDATE` 子句中使用條件邏輯，讓你能用單一指令清理並統一整個資料集。

這種方法不僅比手動修正數千筆記錄更有效率，更是真正的救星。它能確保資料的一致性，並為您做好準備，讓您的資料終於能夠進行可靠的分析。

**實際範例：**

`UPDATE IndirizziSETStato = CASEWHEN Stato IN ('NY', 'New York', 'new-york') THEN 'New York'WHEN Stato IN ('CA', 'California', 'cali') THEN 'California'ELSE Stato -- 保留其他州不變ENDWHEREPaese = 'USA';`

### 複雜獎金的計算

計算變動薪資往往是一項棘手的任務。這取決於無數因素：銷售績效、資歷長短、團隊目標達成情況。與其使用外部腳本，或更糟的是透過 Excel 來處理這些複雜的規則，不如將它們封裝成一個 SQL 儲存程序。

這不僅能集中管理業務邏輯，還能確保計算過程一致且安全，從而降低人為錯誤的風險並確保透明度。

一個預存程序可以接收員工的 ID 作為輸入，並根據資料庫中已有的績效數據，套用複雜的 `if else if` 邏輯，回傳精確的獎金金額。

**邏輯範例（T-SQL）：**

`CREATE PROCEDURE CalcolaBonusDipendente@ID_Dipendente INTASBEGINDECLARE @AnniServizio INT;DECLARE @VenditeAnnuali DECIMAL(10, 2);DECLARE @Bonus DECIMAL(10, 2);SELECT @AnniServizio = Anni_Servizio, @VenditeAnnuali = Vendite_2023FROM PerformanceDipendenti WHERE ID_Dipendente = @ID_Dipendente;IF @VenditeAnnuali > 100000SET @Bonus = @VenditeAnnuali * 0.10; -- 頂尖表現者可獲得 10% 獎金ELSE IF @VenditeAnnuali > 50000 AND @AnniServizio > 5SET @Bonus = @VenditeAnnuali * 0.07; -- 業績良好的資深員工可獲得 7%ELSESET @Bonus = @VenditeAnnuali * 0.05; -- 標準 5% 獎金-- 更新資料表或回傳數值的邏輯SELECT @Bonus AS Bonus_Calcolato;END;`

### 建立靈活的報表

最後，條件邏輯能讓你的報表變得極為靈活。在 `COUNT` 或 `SUM` 等聚合函式中使用 `CASE`，只需掃描一次資料表，就能建立複雜的指標。

例如，您可以透過單一查詢，統計不同類別的訂單數量、彙總各區域的銷售額，並計算待處理訂單的總數。這避免了針對每項指標分別執行查詢，使報表腳本的執行速度大幅提升，且更易於維護。

**實際範例：**

`SELECTCOUNT(CASE WHEN Stato = 'Spedito' THEN 1 END) AS Ordini_Spediti,COUNT(CASE WHEN Stato = 'In Attesa' THEN 1 END) AS Ordini_In_Attesa,SUM(CASE WHEN Regione = 'Nord' THEN Totale END) AS Vendite_Nord,SUM(CASE WHEN Regione = 'Sud' THEN Totale END) AS Vendite_SudFROM Ordini;`

## 處理 NULL 值並優化效能

擁有一套運作正常的條件邏輯只完成了一半的工作。要真正發揮效用，它還必須夠穩健，尤其是速度要夠快。兩個最常見、可能毀掉你分析結果的障礙，就是 **NULL** 值的處理，以及執行速度慢到令人抓狂的查詢。

NULL 值在 SQL 中是個奇怪的東西。任何與 `NULL` 的直接比較（例如 `colonna = NULL` 或 `colonna <> NULL`）既不會回傳真也不會回傳假，而是第三種狀態：`UNKNOWN`。這種看似無害的行為，可能會在你的 `if else if in sql` 邏輯中製造出真正的黑洞，排除掉你原本以為會被納入的行，導致結果失真。

### 主動處理 NULL 值

要避免落入這個陷阱，解決方法只有一個：明確且事先處理好 NULL 值。與其抱著僥倖心態、寄望資料是乾淨的，不如直接在 `CASE` 或 `IF` 運算式中使用特定函式。

你武器庫中最有效的兩件利器是 `COALESCE` 和 `ISNULL`。

- `COALESCE(colonna, valore_default)`：這是 ANSI-SQL 標準函式，也就是說幾乎到處都能找到它。它會回傳參數清單中第一個非 NULL 的值。非常適合在你的條件邏輯啟動之前，就即時將 `NULL` 替換成安全的替代值，例如零或字串 'N/D'。
- `ISNULL(colonna, valore_default)`：這是 [SQL Server](https://www.microsoft.com/it-it/sql-server) 等方言特有的函式，當你只用兩個參數時，本質上和 `COALESCE` 做的事一樣。不過要注意，它在處理資料型別的方式上有一些細微但重要的差異。

整合這些函式後，你的邏輯就能對 `NULL` 免疫。簡單又有效。

選擇正確的函式來處理 NULL 值，對於程式碼的可移植性和效能而言至關重要。

### NULL 處理功能的比較

_一份快速指南，教你根據 SQL 方言和具體使用情境，在 COALESCE、ISNULL 和 NULLIF 之間做選擇，並附上實用範例。_

**COALESCE** 會從一系列參數中回傳第一個非 NULL 的值。它是最靈活、最通用的函式，所有主流方言都支援：SQL Server、PostgreSQL、Oracle、MySQL 和 SQLite。一個典型的使用範例是從工作信箱、個人信箱和一個備援值中，回傳第一個可用的電子郵件地址：`SELECT COALESCE(email_lavoro, email_personale, 'Nessuna email') FROM utenti`。

**ISNULL** 會用指定的替代值取代 NULL 值。它比 COALESCE 更受限，只接受 2 個參數，且僅在 SQL Server 和 T-SQL 中可用。一個實際範例是在沒有折扣價時回傳原價：`SELECT ISNULL(prezzo_scontato, prezzo_listino) FROM prodotti`。

**NULLIF** 會在兩個運算式相等時回傳 NULL，否則回傳第一個運算式的值。它特別適合用來避免除以零的錯誤，並且受到 SQL Server、PostgreSQL、Oracle 和 MySQL 的支援。一個具代表性的範例是計算每筆訂單的平均值，同時防止除以零的情況：`SELECT vendite_totali / NULLIF(numero_ordini, 0) AS media_ordine FROM report`。

總而言之，`COALESCE` 幾乎在所有情況下都是最安全、可移植性最高的選擇。如果你只在 SQL Server 上作業，且偏好它的語法，就使用 `ISNULL`；並隨時準備好 `NULLIF`，以應對像是防止數學錯誤等特定情境。

### 優化條件查詢的效能

條件邏輯,尤其是塞進 `WHERE` 子句裡的那種,可能會變成查詢真正的絆腳石。事實上,有時候它會讓資料庫無法使用現有的索引,迫使系統進行全表掃描,拖慢整體效能。

一個查詢在變快之前都稱不上「完成」。優化 `CASE` 條件並非可有可無的操作,而是撰寫不拖累系統的專業級 SQL 程式碼中不可或缺的一環。

以下是一些實用技巧，確保您的查詢不僅正確，而且流暢：

1. **依照發生機率排列 **`WHEN`** 條件**:務必把最常發生的條件放在最前面。資料庫引擎一旦找到第一個為真的條件就會停止判斷。這個小技巧能大幅減少系統需要處理的工作量,尤其是在超大型資料表上效果更明顯。
2. **保持表達式簡單**:盡量避免在 `WHEN` 子句中使用複雜函式或子查詢。每一列都需要被評估,條件越複雜,耗費的時間就越長。簡單性在效能上永遠是划算的。
3. **留意 **`WHERE`** 子句**:這是一條黃金法則。在 `WHERE` 子句中對已建立索引的欄位套用函式(例如 `WHERE YEAR(data_ordine) = 2023`)是「扼殺」索引最常見的做法之一。如果可能的話,最好保持欄位「乾淨」,並將轉換運算放在比較式的右側(`WHERE data_ordine >= '2023-01-01' AND data_ordine < '2024-01-01'`)。

## 從理論到實踐：關於 SQL 邏輯的重點摘要

理論固然重要，但勝敗終究取決於實戰。為了將理論轉化為真正的實戰能力，以下是您撰寫條件式程式碼的關鍵要點，讓您的程式碼不僅正確，更能兼具效率、可讀性，並具備前瞻性。

- **若追求可移植性,一律選用 **`CASE`。作為 ANSI-SQL 標準,它是各資料庫之間的通用語言。如果你的邏輯有超過兩種可能結果,`CASE` 就不是選項,而是唯一能讓你的程式碼穩健且不受平台限制的選擇。這是一項為未來著想的投資。
- **只在追求簡潔時選用 **`IF`**/**`IIF`**(且僅限可行的情況下)**。這些函式在處理二元(真/假)條件時,因語法精簡而表現出色。但只要邏輯一變複雜,需要用到「否則如果...」,就該立刻捨棄它們,回到 `CASE` 的清晰與可擴展性。
- **務必預先考慮 **`NULL`** 的情況**。未妥善處理的 `NULL` 值可能會扭曲你的結果。務必使用 `COALESCE` 或 `IS NULL` 檢查來明確處理它。這就像繫上安全帶一樣:或許不是每次都用得上,但需要的時候,它能救你一命。
- **務必加上 **`ELSE`。在 `CASE` 中省略 `ELSE` 子句,就等於為意外結果敞開大門(會傳回 `NULL`)。加上 `ELSE` 能讓查詢的行為可預測,並保護你免於意外狀況。
- **優化條件的排列順序**。務必把最可能為真的條件放在 `CASE` 區塊的開頭。SQL 引擎一旦找到第一個為真的條件就會停止判斷。在擁有數百萬列的資料表上,這個小技巧能顯著加快查詢速度。

持之以恆地應用這些原則,你就不只是在寫查詢了。你正在打造一套穩固的[商業智慧解決方案](https://www.electe.net/post/software-business-intelligence),經得起時間與不完美資料的考驗。

## 結論：將您的數據轉化為決策

你已經看到,儘管 SQL 沒有直接的 `IF ELSE IF` 指令,它卻提供了更強大、更靈活的工具。`CASE WHEN` 表達式是你的主要利器,這個通用標準讓你能夠直接在查詢中實作複雜的業務邏輯。對於較簡單的情況,`IF` 和 `IIF` 這類函式則提供更精簡的語法。

掌握這些技術，意味著能將數據從單純的記錄轉化為策略性洞察，並能以高效且可擴展的方式進行客戶分群、資料清理，以及建立動態報表。

現在，您已準備好邁出下一步。別只是詢問您的數據，而是讓數據「開口說話」。立即開始應用這些條件邏輯，以獲得更聰明的答案，並引導出更佳的商業決策。

準備好在不寫一行程式碼的情況下,把你的資料轉化為競爭優勢了嗎?[了解 Electe 如何透過免費試用,讓你的資料變得有意義](https://www.electe.net)。
