การจัดเรียงแบบกำหนดเองด้วย CASE และ Regular Expression
เมื่อต้องการจัดเรียงข้อมูลที่ผสมผสานระหว่างตัวเลขและตัวอักษร โดยต้องการให้ตัวอักษรมาก่อน ตัวเลขทีหลัง (หรือตรงข้าม) สามารถใช้ CASE WHEN ร่วมกับ REGEXP เพื่อสร้างเงื่อนไขการจัดเรียงแบบกำหนดเองได้
ตัวอย่างสร้างตารางและข้อมูล
CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Value VARCHAR(20)
);
เพิ่มข้อมูลผสมตัวเลขและตัวอักษร:
INSERT INTO DemoTable (Value) VALUES
('101'), ('P'), ('A'), ('53'), ('R'), ('C'), ('190');
ข้อมูลก่อนจัดเรียง
+----+-------+ | Id | Value | +----+-------+ | 1 | 101 | | 2 | P | | 3 | A | | 4 | 53 | | 5 | R | | 6 | C | | 7 | 190 | +----+-------+
คำสั่งจัดเรียง: ตัวอักษรก่อน ตัวเลขทีหลัง
SELECT Id, Value FROM DemoTable ORDER BY CASE WHEN Value REGEXP '[a-zA-Z]' THEN 0 ELSE 0+Value END ASC, Value;
ผลลัพธ์: ตัวอักษร A-Z ก่อน ตัวเลขจากน้อยไปมากทีหลัง
+----+-------+ | Id | Value | +----+-------+ | 3 | A | | 6 | C | | 2 | P | | 5 | R | | 4 | 53 | | 1 | 101 | | 7 | 190 | +----+-------+
คำอธิบาย:
CASE WHEN Value REGEXP '[a-zA-Z]' THEN 0 ELSE 0+Value END: ตรวจสอบว่า Value มีตัวอักษรหรือไม่ ถ้ามีให้ค่า 0 (จัดอันดับก่อน) ถ้าไม่มี (คือตัวเลข) ให้แปลงเป็นตัวเลขด้วย0+ValueValueท้ายคำสั่ง: จัดเรียงรองภายในกลุ่มเดียวกัน (ตัวอักษรตาม A-Z, ตัวเลขตามค่าตัวเลข)
ประยุกต์ใช้: เปลี่ยน THEN 0 ELSE 1 เพื่อสลับลำดับกลุ่ม หรือแก้ Regex ตามรูปแบบที่ต้องการ เช่น '^[0-9]+$' สำหรับตัวเลขบริสุทธิ์