Giới thiệu
Hàm GREATEST() trả về giá trị lớn nhất trong danh sách, nhưng trả về NULL nếu bất kỳ tham số nào là NULL. Cần dùng IF() hoặc COALESCE() để xử lý NULL trước.
1. Tạo bảng và dữ liệu
mysql> create table DemoTable (
-> Value1 int,
-> Value2 int
-> );
Query OK, 0 rows affected (0.77 sec)
mysql> insert into DemoTable values(78,89);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values(19,null);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values(null,0);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values(null,95);
Query OK, 1 row affected (0.15 sec)
2. Dữ liệu gốc
mysql> select *from DemoTable;
+--------+--------+ | Value1 | Value2 | +--------+--------+ | 78 | 89 | | 19 | NULL | | NULL | 0 | | NULL | 95 | +--------+--------+ 4 rows in set (0.00 sec)
3. Tìm max xử lý NULL
mysql> select greatest(
-> if(Value1 is null, 0, Value1),
-> if(Value2 is null, 0, Value2)
-> ) from DemoTable;
Logic: IF(col IS NULL, 0, col) thay NULL bằng 0, sau đó GREATEST so sánh.
4. Kết quả
+-------------------------------------------------------------------+ | greatest(if(Value1 is null,0,Value1),if(Value2 is null,0,Value2)) | +-------------------------------------------------------------------+ | 89 | | 19 | | 0 | | 95 | +-------------------------------------------------------------------+ 4 rows in set (0.00 sec)
Cách viết gọn hơn:
SELECT GREATEST(COALESCE(Value1, 0), COALESCE(Value2, 0)) FROM DemoTable; -- hoặc SELECT GREATEST(IFNULL(Value1, 0), IFNULL(Value2, 0)) FROM DemoTable;
Lưu ý: GREATEST/LEAST trả về NULL nếu bất kỳ tham số NULL. COALESCE/IFNULL chuyển NULL thành giá trị mặc định. Khác với MAX() (hàm tập hợp) bỏ qua NULL.