บทนำ
เมื่อต้องการจัดเรียงหรือเลือกข้อมูลวันที่ โดยให้ค่า NULL ใช้ค่าสำรอง (Fallback) จากคอลัมน์อื่น สามารถใช้ IFNULL() หรือ COALESCE() ในคำสั่ง ORDER BY หรือ WHERE
ตัวอย่างการสร้างตารางและเพิ่มข้อมูล
mysql> CREATE TABLE DemoTable (
-> AddedDate DATE,
-> UpdatedDate DATE
-> );
Query OK, 0 rows affected (0.95 sec)
mysql> INSERT INTO DemoTable VALUES('2019-01-10', '2019-06-01');
mysql> INSERT INTO DemoTable VALUES('2019-05-19', NULL);
mysql> INSERT INTO DemoTable VALUES(NULL, '2019-09-05');
แสดงข้อมูลทั้งหมด
mysql> SELECT * FROM DemoTable;
ผลลัพธ์
+------------+--------------+
| AddedDate | UpdatedDate |
+------------+--------------+
| 2019-01-10 | 2019-06-01 |
| 2019-05-19 | NULL |
| NULL | 2019-09-05 |
+------------+--------------+
3 rows in set (0.00 sec)
กรณีที่ 1: เรียงลำดับจากใหม่ไปเก่า (DESC) - ใช้ UpdatedDate ถ้ามี ไม่งั้น AddedDate
mysql> SELECT * FROM DemoTable
-> ORDER BY IFNULL(UpdatedDate, AddedDate) DESC;
ผลลัพธ์
+------------+--------------+
| AddedDate | UpdatedDate |
+------------+--------------+
| NULL | 2019-09-05 | -- ใช้ UpdatedDate (09-05)
| 2019-01-10 | 2019-06-01 | -- ใช้ UpdatedDate (06-01)
| 2019-05-19 | NULL | -- ใช้ AddedDate (05-19)
+------------+--------------+
3 rows in set (0.00 sec)
กรณีที่ 2: เรียงลำดับจากเก่าไปใหม่ (ASC)
mysql> SELECT * FROM DemoTable
-> ORDER BY IFNULL(UpdatedDate, AddedDate);
ผลลัพธ์
+------------+--------------+
| AddedDate | UpdatedDate |
+------------+--------------+
| 2019-05-19 | NULL | -- ใช้ AddedDate (05-19)
| 2019-01-10 | 2019-06-01 | -- ใช้ UpdatedDate (06-01)
| NULL | 2019-09-05 | -- ใช้ UpdatedDate (09-05)
+------------+--------------+
3 rows in set (0.00 sec)
คำอธิบาย
IFNULL(UpdatedDate, AddedDate)คืนค่า UpdatedDate ถ้าไม่ใช่ NULL, ไม่งั้น AddedDate- เหมาะสำหรับระบบ Audit Log: ใช้ UpdatedDate เป็นหลัก, AddedDate เป็นสำรอง
COALESCE(UpdatedDate, AddedDate, '1970-01-01')ใช้ได้หากมีคอลัมน์สำรองมากกว่า 1