業務場景:表 abc(uid, num1, num2, num3),需查詢每行三列中的最大值並顯示 uid, max_num。本文對比嵌套 IF 寫法與標準函數 GREATEST(),展示最佳實踐。
CREATE TABLE `abc` (
`uid` INT(10) NOT NULL,
`num1` INT(8) NOT NULL,
`num2` INT(8) NOT NULL,
`num3` INT(8) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
SELECT
IF(
(SELECT IF(num1 > num2, num1, num2)) > num3,
(SELECT IF(num1 > num2, num1, num2)),
num3
) AS max_num, uid
FROM abc;
缺點:重複計算、嵌套子查詢、可讀性極差、優化器難以優化。
SELECT GREATEST(num1, num2, num3) AS max_num, uid FROM abc;
優勢**:
GREATEST(val1, val2, ..., valN)IFNULL/COALESCE)+--------+-----+
| max_num| uid |
+--------+-----+
| 3 | 1 |
| 3 | 2 |
| 4 | 3 |
| 5 | 4 |
| 8 | 5 |
| 13 | 6 |
| 56 | 7 |
+--------+-----+
7 rows in set
LEAST(num1, num2, num3)GREATEST(IFNULL(num1,0), IFNULL(num2,0), IFNULL(num3,0))SELECT GREATEST(
CASE WHEN num1 > 0 THEN num1 ELSE NULL END,
CASE WHEN num2 > 0 THEN num2 ELSE NULL END,
CASE WHEN num3 > 0 THEN num3 ELSE NULL END
) AS max_num FROM abc;
| 指標 | 嵌套 IF | GREATEST() |
|---|---|---|
| 解析時間 | 較長 | 極短 |
| 執行計劃 | 可能產生臨時表 | 簡單投影 |
| 可維護性 | 極低 | 高 |
| 擴展性 | 修改極其困難 | 增加參數即可 |
多列比較最大/最小值,首選 GREATEST()/LEAST()。僅在極其複雜的條件邏輯下(如不同列不同權重、分段函數)才考慮 CASE WHEN 組合。拒絕嵌套 IF/子查詢反模式。