จัดลำดับข้อมูลตามลำดับที่กำหนดเองด้วย CASE
เมื่อต้องการเรียงข้อมูลไม่ใช่ตาม Alphabet หรือ Numeric Order แต่มาจากลำดับที่เรากำหนดเอง (Custom Sort Order) ให้ใช้ CASE ใน ORDER BY clause
ตัวอย่าง: จัดลำดับ StudentId ตามลำดับที่ต้องการ
CREATE TABLE DemoTable(StudentId VARCHAR(100));
INSERT INTO DemoTable VALUES('STU-980'), ('STU-1029'), ('STU-189'), ('STU-890');
Query เรียงตามลำดับ: STU-890, STU-1029, STU-980, STU-189
SELECT * FROM DemoTable
ORDER BY CASE
WHEN StudentId = 'STU-890' THEN 1
WHEN StudentId = 'STU-1029' THEN 2
WHEN StudentId = 'STU-980' THEN 3
WHEN StudentId = 'STU-189' THEN 4
ELSE 5
END;
ผลลัพธ์:
+-----------+
| StudentId |
+-----------+
| STU-890 |
| STU-1029 |
| STU-980 |
| STU-189 |
+-----------+
วิธีทางเลือก: ใช้ FIELD() Function (MySQL Specific)
-- ใช้ FIELD() สั้นกว่า และอ่านง่ายกว่า
SELECT * FROM DemoTable
ORDER BY FIELD(StudentId, 'STU-890', 'STU-1029', 'STU-980', 'STU-189');
FIELD(str, val1, val2, ...) คืนค่า Index (1-based) ของ str ในรายการ ถ้าไม่เจอคืน 0 (จะอยู่ท้ายสุด)
เปรียบเทียบ CASE vs FIELD()
| คุณสมบัติ | CASE | FIELD() |
|---|---|---|
| ความยืดหยุ่น | สูง (เขียนเงื่อนไขซับซ้อนได้) | ต่ำ (แค่ Match ค่าเท่านั้น) |
| รองรับ Range/Condition | ได้ (เช่น WHEN age > 18) | ไม่ได้ |
| Performance | คล้ายกัน | คล้ายกัน |
| Portability | ANSI SQL (รองรับ DB อื่น) | MySQL Only |
Best Practice
- ใช้ FIELD() สำหรับรายการค่าคงที่ (Enum-like values)
- ใช้ CASE สำหรับ Logic ซับซ้อน Range, Multiple Conditions
- เพิ่ม
ELSE 999ใน CASE เพื่อจัดการค่าที่ไม่ได้กำหนด ให้อยู่ท้ายสุด