บทความนี้สาธิตการจัดลำดับข้อมูลแบบกำหนดเอง (Custom Ordering) ใน MySQL โดยใช้ NULLIF() จัดการค่าว่าง และ FIELD() กำหนดลำดับเฉพาะของค่า
สร้างตารางและข้อมูลทดสอบ (มีค่า NULL และค่าว่าง)
mysql> CREATE TABLE DemoTable672(
CustomerId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
CustomerName VARCHAR(100),
CustomerAmount INT
);
Query OK, 0 rows affected (0.81 sec)
mysql> INSERT INTO DemoTable672(CustomerName, CustomerAmount) VALUES('Chris', 560);
mysql> INSERT INTO DemoTable672(CustomerName, CustomerAmount) VALUES('Robert', NULL);
mysql> INSERT INTO DemoTable672(CustomerName, CustomerAmount) VALUES('', 450);
mysql> INSERT INTO DemoTable672(CustomerName, CustomerAmount) VALUES('David', 456);
mysql> INSERT INTO DemoTable672(CustomerName, CustomerAmount) VALUES('Carol', 786);
คิวรี ORDER BY แบบกำหนดเอง
mysql> SELECT * FROM DemoTable672
ORDER BY
NULLIF(CustomerName, '') IS NULL,
FIELD(CustomerAmount, 560, 786, 450, 456);
ผลลัพธ์
+------------+--------------+----------------+
| CustomerId | CustomerName | CustomerAmount |
+------------+--------------+----------------+
| 2 | Robert | NULL |
| 1 | Chris | 560 |
| 5 | Carol | 786 |
| 4 | David | 456 |
| 3 | | 450 |
+------------+--------------+----------------+
คำอธิบาย:
NULLIF(CustomerName, '') IS NULL- แปลงค่าว่าง '' เป็น NULL แล้วจัด NULL ไปก่อน (TRUE=1, FALSE=0)FIELD(CustomerAmount, 560, 786, 450, 456)- กำหนดลำดับเฉพาะ: 560 ก่อน, ตามด้วย 786, 450, 456 ค่าทไม่อยู่ในลิสต์จะไปท้าย- Robert (NULL Amount) อยู่บนสุด เพราะ NULLIF...IS NULL = TRUE (1)
- ค่าว่าง '' ใน CustomerName ถูกจัดเป็น NULL ไปอยู่บนสุดเช่นกัน