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_IdP_NameStock
1LCD100
2CPU0
3RAM50

範例: 根據庫存數量顯示庫存狀態。

SELECT P_Name, Stock,
       IF(Stock > 0, '有庫存', '已售完') AS Status
FROM products;

結果:

P_NameStockStatus
LCD100有庫存
CPU0已售完
RAM50有庫存

巢狀 IF() (Nested IF)

當需要處理多於兩種情況時,可以巢狀使用 IF() 函數:

SELECT P_Name, Stock,
       IF(Stock > 50, '充足',
          IF(Stock > 0, '偏低', '已售完')) AS Status
FROM products;

結果:

P_NameStockStatus
LCD100充足
CPU0已售完
RAM50偏低

⚠️ 建議: 對於複雜的多重條件判斷,使用 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 的值

相關主題