หลักการ: ORDER BY CASE WHEN
ใช้ CASE WHEN ภายใน ORDER BY เพื่อกำหนดลำดับแสดงผลแบบกำหนดเอง (Custom Sort Order)
ไวยากรณ์
SELECT * FROM yourTable
ORDER BY CASE
WHEN condition1 THEN sort_value1
WHEN condition2 THEN sort_value2
...
ELSE default_sort_value
END;
ตัวอย่าง: ตาราง demo51
CREATE TABLE demo51 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20)
);
INSERT INTO demo51 (name) VALUES
('John'), ('Bob'), ('David'), ('Sam');
ข้อมูล
+----+-------+ | id | name | +----+-------+ | 1 | John | | 2 | Bob | | 3 | David | | 4 | Sam | +----+-------+
คำสั่ง: เรียง John ก่อน, ตามด้วย Bob, David, Sam ท้ายสุด
SELECT * FROM demo51
ORDER BY CASE
WHEN name = 'John' THEN 110
WHEN name = 'Bob' THEN 105
WHEN name = 'David' THEN 104
ELSE 101
END;
ผลลัพธ์
+----+-------+ | id | name | +----+-------+ | 4 | Sam | -- ELSE 101 (น้อยที่สุด) | 3 | David | -- 104 | 2 | Bob | -- 105 | 1 | John | -- 110 (มากที่สุด → มาก่อน) +----+-------+
หมายเหตุ: ORDER BY เรียงจากน้อยไปมาก (ASC) ดังนั้นค่า CASE ที่มากกว่า จะอยู่บน
กรณีศึกษาเพิ่มเติม
1. เรียงสถานะออเดอร์: Pending → Processing → Shipped → Delivered → Cancelled
ORDER BY CASE status
WHEN 'Pending' THEN 1
WHEN 'Processing' THEN 2
WHEN 'Shipped' THEN 3
WHEN 'Delivered' THEN 4
WHEN 'Cancelled' THEN 5
ELSE 6
END
2. เรียงตามหลายเงื่อนไข (Priority + Date)
ORDER BY
CASE WHEN priority = 'High' THEN 1
WHEN priority = 'Medium' THEN 2
ELSE 3 END,
created_at ASC
3. ใส่ NULL ไว้ท้าย
ORDER BY
CASE WHEN column IS NULL THEN 1 ELSE 0 END,
column ASC
เคล็ดลับ
- ตัวเลขใน THEN เป็นเพียง "น้ำหนัก" สำหรับเรียง — ไม่ต้องเป็น 1,2,3... ใช้ 100, 200, 300 ก็ได้
- รวมกับคอลัมน์อื่นได้:
ORDER BY CASE ..., created_at DESC - ใช้กับ ENUM ได้โดยตรง:
ORDER BY FIELD(status, 'Pending','Processing','Shipped')(MySQL specific)
ฟังก์ชัน FIELD() — ทางเลือกที่ง่ายกว่า
ORDER BY FIELD(name, 'John', 'Bob', 'David', 'Sam')
คืนค่าตำแหน่งในลิสต์ (1,2,3,4) ไม่พบ = 0 → เรียง 0 ก่อน (Sam จะอยู่บน) ต้องระวัง