การจัดลำดับข้อมูลแบบกำหนดเองด้วย ORDER BY CASE WHEN
เมื่อต้องการจัดลำดับข้อมูลไม่ใช่ตามตัวอักษรหรือตัวเลขตามปกติ ให้ใช้ ORDER BY CASE WHEN เพื่อกำหนดลำดับความสำคัญของแต่ละค่าเอง
รูปแบบคำสั่ง
SELECT * FROM table_name
ORDER BY CASE column_name
WHEN value1 THEN priority1
WHEN value2 THEN priority2
ELSE default_priority
END;
ตัวอย่าง: จัดลำดับสีตามความสำคัญที่กำหนดเอง
1. สร้างตารางและเพิ่มข้อมูล
CREATE TABLE DemoTable (
Color VARCHAR(100)
);
INSERT INTO DemoTable VALUES ('Red');
INSERT INTO DemoTable VALUES ('Green');
INSERT INTO DemoTable VALUES ('Blue');
INSERT INTO DemoTable VALUES ('Yellow');
2. ดูข้อมูลก่อนจัดลำดับ
SELECT * FROM DemoTable;
ผลลัพธ์:
+--------+
| Color |
+--------+
| Red |
| Green |
| Blue |
| Yellow |
+--------+
3. จัดลำดับ: Blue ก่อน, ตามด้วย Green, Yellow, สุดท้ายคือ Red
SELECT * FROM DemoTable
ORDER BY CASE Color
WHEN 'Blue' THEN 10
WHEN 'Green' THEN 20
WHEN 'Yellow' THEN 30
ELSE 100
END;
ผลลัพธ์:
+--------+
| Color |
+--------+
| Blue |
| Green |
| Yellow |
| Red |
+--------+
การทำงานของ CASE WHEN ใน ORDER BY
- MySQL จะคำนวณค่า CASE สำหรับแต่ละแถว
- ค่าที่ได้ (10, 20, 30, 100) ถูกใช้เป็นคีย์จัดลำดับ
- ค่าที่น้อยกว่าจะอยู่หน้ากว่า (ASC - เริ่มต้น)
- ค่าที่ไม่ตรงเงื่อนไขจะใช้ค่า ELSE (100 = อยู่ท้ายสุด)
รูปแบบ CASE แบบ Search (เปรียบเทียบเงื่อนไขซับซ้อน)
ORDER BY CASE
WHEN Score >= 90 THEN 1
WHEN Score >= 70 THEN 2
WHEN Score >= 50 THEN 3
ELSE 4
END
การจัดลำดับหลายระดับ (Multi-level Sorting)
SELECT * FROM DemoTable
ORDER BY
CASE Color WHEN 'Blue' THEN 1 WHEN 'Green' THEN 2 ELSE 3 END,
Color ASC; -- จัดลำดับอักษรภายในกลุ่มเดียวกัน
กรณีใช้งานจริง
- จัดลำดับสถานะ: 'Urgent' > 'High' > 'Normal' > 'Low'
- จัดลำดับประเภทสินค้า: 'Featured' > 'New' > 'Sale' > 'Regular'
- จัดลำดับวันในสัปดาห์: Monday=1, Tuesday=2, ..., Sunday=7
หมายเหตุเกี่ยวกับตัวอย่างต้นฉบับ
โค้ดต้นฉบับมีข้อผิดพลาด: create table DemoTable order by with vas Color varchar(100) ควรเป็น CREATE TABLE DemoTable (Color VARCHAR(100)) แก้ไขแล้วในตัวอย่างข้างต้น