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

MySQL ORDER BY กรณีพิเศษด้วย NULLIF และ FIELD

บทความนี้สาธิตการจัดลำดับข้อมูลแบบกำหนดเอง (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 ไปอยู่บนสุดเช่นกัน