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

วิธีจัดเรียงข้อมูลด้วย ORDER BY CASE WHEN REGEXP ใน MySQL

การจัดเรียงแบบกำหนดเองด้วย 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+Value
  • Value ท้ายคำสั่ง: จัดเรียงรองภายในกลุ่มเดียวกัน (ตัวอักษรตาม A-Z, ตัวเลขตามค่าตัวเลข)

ประยุกต์ใช้: เปลี่ยน THEN 0 ELSE 1 เพื่อสลับลำดับกลุ่ม หรือแก้ Regex ตามรูปแบบที่ต้องการ เช่น '^[0-9]+$' สำหรับตัวเลขบริสุทธิ์