Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: เรียงลำดับตัวเลขแต่ยกเว้น 0 ให้อยู่ท้ายสุด

การเรียงตัวเลข 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 ถ้าไม่ใช่ 0
  • ORDER 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