在 MySQL 資料庫開發中,IFNULL 和 NULLIF 是兩個常被混淆的流程控制函數。雖然名稱相似,但它們的功能與應用場景截然不同。本文將透過語法說明與實際範例,幫助您徹底掌握這兩個函數的用法與差異。
語法: IFNULL(expr1, expr2)
運作邏輯: 若 expr1 不為 NULL,則回傳 expr1;否則回傳 expr2。回傳值的型別(數值或字串)取決於使用的語境。
mysql> SELECT IFNULL(1, 0);
-> 1
mysql> SELECT IFNULL(NULL, 10);
-> 10
mysql> SELECT IFNULL(1/0, 10);
-> 10
mysql> SELECT IFNULL(1/0, 'yes');
-> 'yes'
型別推論規則: IFNULL 的預設結果型別為兩個運算式中較「通用」的一個,優先順序為 STRING、REAL、INTEGER。例如建立表格時:
CREATE TABLE tmp SELECT IFNULL(1, 'test') AS test;
此例中,test 欄位的型別會是 CHAR(4)。
語法: NULLIF(expr1, expr2)
運作邏輯: 若 expr1 = expr2 成立,則回傳 NULL;否則回傳 expr1。這等同於 CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END。
mysql> SELECT NULLIF(1, 1);
-> NULL
mysql> SELECT NULLIF(1, 2);
-> 1
效能提示: 當參數不相等時,MySQL 會對 expr1 求值兩次,在複雜運算式中需注意效能影響。
| 函數 | 核心用途 | 回傳 NULL 的條件 | 典型應用場景 |
|---|---|---|---|
| IFNULL | NULL 值替換/預設值 | 第一個參數為 NULL 時回傳第二個參數(非 NULL) | 資料顯示預設值、避免 NULL 參與運算導致錯誤 |
| NULLIF | 特定值轉為 NULL | 兩個參數相等時 | 防止除零錯誤(如 NULLIF(divisor, 0))、資料清洗 |
NULL 欄位顯示為「無資料」、「0」或其他預設文字。SELECT 100 / NULLIF(count, 0) 可避免除零錯誤並回傳 NULL 而非報錯。掌握這兩個函數的差異,能讓您的 SQL 查詢更健壯、更符合業務邏輯需求。