การเรียงตัวเลข ASC แต่ให้ 0 อยู่ท้ายสุดด้วย ORDER BY (col=0), col
เทคนิคนี้ใช้เงื่อนไข Boolean (value = 0) ซึ่งคืนค่า 1 (TRUE) หรือ 0 (FALSE) ใน MySQL เรียง FALSE (0) ก่อน TRUE (1) ดังนั้นค่าที่ไม่ใช่ 0 (FALSE) จะมาก่อน ค่า 0 (TRUE) จะตามหลัง แล้วค่อยเรียงค่าจริงในแต่ละกลุ่ม
ตัวอย่างการใช้งาน
สร้างตารางและเพิ่มตัวเลขผสม 0:
mysql> CREATE TABLE reorderIntegerExcept0 (
-> value INT
-> );
Query OK, 0 rows affected (0.70 sec)
mysql> INSERT INTO reorderIntegerExcept0 VALUES(90),(10),(0),(40),(0),(50),(80),(0),(300);
Query OK, 9 rows affected (0.15 sec)
ข้อมูลก่อนเรียง:
mysql> SELECT * FROM reorderIntegerExcept0;
+-------+
| value |
+-------+
| 90 |
| 10 |
| 0 |
| 40 |
| 0 |
| 50 |
| 80 |
| 0 |
| 300 |
+-------+
9 rows in set (0.00 sec)
เรียง ASC ยกเว้น 0 ให้อยู่ท้าย:
mysql> SELECT * FROM reorderIntegerExcept0 ORDER BY value = 0, value;
+-------+
| value |
+-------+
| 10 |
| 40 |
| 50 |
| 80 |
| 90 |
| 300 |
| 0 |
| 0 |
| 0 |
+-------+
9 rows in set (0.00 sec)
เรียง DESC ยกเว้น 0 ให้อยู่ท้าย (ค่าอื่นมาก→น้อย, 0 ท้าย):
mysql> SELECT * FROM reorderIntegerExcept0 ORDER BY value = 0, value DESC;
+-------+
| value |
+-------+
| 300 |
| 90 |
| 80 |
| 50 |
| 40 |
| 10 |
| 0 |
| 0 |
| 0 |
+-------+
9 rows in set (0.00 sec)
คำอธิบาย
value = 0คืนค่า 1 ถ้าเป็น 0, 0 ถ้าไม่ใช่ 0ORDER BY value = 0, value→ เรียงกลุ่มแรก (value=0 คือ FALSE=0) ก่อน, กลุ่มสอง (value=0 คือ TRUE=1) ท้าย- ในแต่ละกลุ่ม เรียงตาม
valueตาม ASC/DESC ที่ระบุ
ประยุกต์ใช้: ยกเว้นค่าอื่น (เช่น -1, NULL)
-- ยกเว้น -1 ให้อยู่ท้าย
ORDER BY (value = -1), value
-- ยกเว้น NULL ให้อยู่ท้าย (NULLS LAST พฤติกรรมเริ่มต้นของ MySQL)
ORDER BY (value IS NULL), value
-- ยกเว้น NULL ให้อยู่หน้า (NULLS FIRST)
ORDER BY (value IS NOT NULL), value
เทคนิคนี้ใช้ได้กับทุกชนิดข้อมูลที่เปรียบเทียบได้ ไม่ใช่เฉพาะ INT