IF() 函數 (SQL IF() Function)
IF() 函數用於根據條件返回不同的值,類似於程式語言中的三元運算子 (condition ? true_value : false_value)。這是一個簡化的條件判斷函數,適用於簡單的二元條件。
💡 注意:
IF()函數是 MySQL 特有的。對於跨資料庫相容性或複雜的多重條件判斷,建議使用標準 SQL 的CASE表達式。
MySQL IF() 語法 (Syntax)
IF(condition, value_if_true, value_if_false)
condition:要評估的條件表達式value_if_true:當條件為TRUE時返回的值value_if_false:當條件為FALSE(或NULL) 時返回的值
IF() 用法範例 (Example)
products 資料表:
| P_Id | P_Name | Stock |
|---|---|---|
| 1 | LCD | 100 |
| 2 | CPU | 0 |
| 3 | RAM | 50 |
範例: 根據庫存數量顯示庫存狀態。
SELECT P_Name, Stock,
IF(Stock > 0, '有庫存', '已售完') AS Status
FROM products;
結果:
| P_Name | Stock | Status |
|---|---|---|
| LCD | 100 | 有庫存 |
| CPU | 0 | 已售完 |
| RAM | 50 | 有庫存 |
巢狀 IF() (Nested IF)
當需要處理多於兩種情況時,可以巢狀使用 IF() 函數:
SELECT P_Name, Stock,
IF(Stock > 50, '充足',
IF(Stock > 0, '偏低', '已售完')) AS Status
FROM products;
結果:
| P_Name | Stock | Status |
|---|---|---|
| LCD | 100 | 充足 |
| CPU | 0 | 已售完 |
| RAM | 50 | 偏低 |
⚠️ 建議: 對於複雜的多重條件判斷,使用
CASE語法會更清晰易讀。
IF() vs CASE 比較
-- 使用 IF() (MySQL 特有)
SELECT IF(Stock > 0, '有庫存', '已售完') AS Status FROM products;
-- 使用 CASE (標準 SQL,所有資料庫支援)
SELECT CASE WHEN Stock > 0 THEN '有庫存' ELSE '已售完' END AS Status FROM products;
| 特性 | IF() | CASE |
|---|---|---|
| 資料庫支援 | MySQL 專用 | 所有主流資料庫 |
| 條件數量 | 僅二元條件 | 支援多重條件 |
| 可讀性 | 簡單情況較佳 | 複雜情況較佳 |
| 巢狀複雜度 | 多層巢狀難閱讀 | 平坦結構易閱讀 |
IF() 的實際應用
1. 計算折扣後價格
SELECT P_Name, Price,
IF(Price > 1000, Price * 0.9, Price) AS Discounted_Price
FROM products;
2. 條件計數
SELECT
SUM(IF(Status = 'Active', 1, 0)) AS Active_Count,
SUM(IF(Status = 'Inactive', 1, 0)) AS Inactive_Count
FROM users;
3. NULL 值處理
SELECT Name,
IF(Phone IS NULL, '未提供', Phone) AS Phone
FROM customers;
💡 提示: 對於 NULL 值處理,也可以使用
IFNULL()或COALESCE()。
SQL Server 的 IIF() 函數
SQL Server 2012 及以後版本提供了類似的 IIF() 函數:
-- SQL Server 語法
SELECT P_Name, IIF(Stock > 0, '有庫存', '已售完') AS Status
FROM products;
SQL Server 的 IF...ELSE 流程控制
在 SQL Server 的預存程序或批次處理中,可以使用 IF...ELSE 語句進行流程控制:
IF @Stock > 0
BEGIN
PRINT '有庫存';
-- 執行有庫存時的邏輯
END
ELSE
BEGIN
PRINT '已售完';
-- 執行已售完時的邏輯
END
⚠️ 注意:
IF...ELSE是流程控制語句,只能用於預存程序或批次處理中,不能直接用於SELECT查詢。
MySQL 的 IFNULL() 和 NULLIF()
MySQL 還提供了兩個與 IF() 相關的函數:
IFNULL()
當第一個參數為 NULL 時,返回第二個參數:
SELECT IFNULL(Phone, '未提供') AS Phone FROM customers;
-- 等同於
SELECT IF(Phone IS NULL, '未提供', Phone) AS Phone FROM customers;
NULLIF()
當兩個參數相等時返回 NULL,否則返回第一個參數:
SELECT NULLIF(Stock, 0) AS Stock FROM products;
-- 當 Stock 為 0 時返回 NULL,否則返回 Stock 的值
相關主題
- CASE - 標準 SQL 條件表達式
- IFNULL / ISNULL / NVL - NULL 值處理函數
- COALESCE - 返回第一個非 NULL 值
- NULLIF - 條件性返回 NULL