expr1 不為 NULL 回傳 expr1,否則回傳 expr2。回傳型別取決於上下文(數值/字串)。
SELECT IFNULL(1,0); -- 1
SELECT IFNULL(NULL,10); -- 10
SELECT IFNULL(1/0,10); -- 10 (除零產生 NULL)
SELECT IFNULL(1/0,'yes'); -- 'yes'
expr1 為 TRUE(非 0 且非 NULL)回傳 expr2,否則 expr3。
SELECT IF(1>2, 2, 3); -- 3
SELECT IF(1<2, 'yes', 'no'); -- 'yes'
SELECT IF(STRCMP('test','test1'),'yes','no'); -- 'no'
SELECT IF(0.1, 1, 0); -- 0 (0.1 隱含轉整數 0 → FALSE)
SELECT IF(0.1 <> 0, 1, 0); -- 1 (比較運算保留浮點數語義)
教訓:IF() 的第一參數以整數語境評估,浮點/字串條件必須用比較運算式(<>0、IS NOT NULL、= 'val')轉為布林。
CASE value
WHEN compare_value THEN result
[WHEN ... THEN ...]
[ELSE result]
END
SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END; -- 'one'
CASE
WHEN condition THEN result
[WHEN ... THEN ...]
[ELSE result]
END
SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END; -- 'true'
SELECT CASE BINARY 'B' WHEN 'a' THEN 1 WHEN 'b' THEN 2 END; -- NULL (大小寫敏感)
IFNULL / COALESCE(多參數)。IF(簡單雙分支)或 CASE(多重條件、可讀性佳)。IF 第一參數直接放浮點/字串,務必加比較運算。CASE 無匹配且無 ELSE 回傳 NULL。