การใช้ ORDER BY กับ IF() เพื่อจัดการค่าว่าง
สร้างคอลัมน์คำนวณชั่วคราว: ค่าว่าง/NULL = 1, ค่าปกติ = 0 แล้วเรียงตามคอลัมน์นี้ก่อน
รูปแบบคำสั่ง
SELECT * FROM yourTableName ORDER BY IF(yourColumnName = '' OR yourColumnName IS NULL, 1, 0), yourColumnName;
ตัวอย่างสร้างตารางและข้อมูล (มีค่าว่าง)
mysql> CREATE TABLE emptyCellsAtEnd (
-> ProductId VARCHAR(100)
-> );
Query OK, 0 rows affected (0.65 sec)
mysql> INSERT INTO emptyCellsAtEnd VALUES('');
mysql> INSERT INTO emptyCellsAtEnd VALUES('P-1');
mysql> INSERT INTO emptyCellsAtEnd VALUES('P-2');
mysql> INSERT INTO emptyCellsAtEnd VALUES('');
mysql> INSERT INTO emptyCellsAtEnd VALUES('P-3');
mysql> INSERT INTO emptyCellsAtEnd VALUES('P-4');
mysql> INSERT INTO emptyCellsAtEnd VALUES('P-9');
mysql> INSERT INTO emptyCellsAtEnd VALUES('');
mysql> INSERT INTO emptyCellsAtEnd VALUES('P-8');
ข้อมูลก่อนเรียง
mysql> SELECT * FROM emptyCellsAtEnd;
+-----------+ | ProductId | +-----------+ | | | P-1 | | P-2 | | | | P-3 | | P-4 | | P-9 | | | | P-8 | +-----------+ 9 rows in set (0.00 sec)
คำสั่งเรียง ให้ค่าว่าง/NULL อยู่ท้าย
mysql> SELECT * FROM emptyCellsAtEnd
-> ORDER BY IF(ProductId = '' OR ProductId IS NULL, 1, 0), ProductId;
+-----------+ | ProductId | +-----------+ | P-1 | | P-2 | | P-3 | | P-4 | | P-8 | | P-9 | | | | | | | +-----------+ 9 rows in set (0.00 sec)
วิธีอื่นที่เทียบเท่า:
-- ใช้ CASE ORDER BY CASE WHEN ProductId = '' OR ProductId IS NULL THEN 1 ELSE 0 END, ProductId -- ใช้ COALESCE (NULL ก่อน แล้วค่าว่าง) ORDER BY COALESCE(NULLIF(ProductId, ''), '~'), ProductId -- MySQL 8.0+ ใช้ NULLS LAST (สำหรับ NULL จริง ไม่รวม empty string) ORDER BY ProductId NULLS LAST
สรุป: ใช้ IF/CASE สร้าง priority column แล้ว ORDER BY 2 ระดับ