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

MySQL: เรียงลำดับตัวอักษรก่อน ตัวเลขทีหลังด้วย REGEXP และ ORDER BY

เมื่อต้องการเรียงข้อมูลให้ ตัวอักษร (Alphabet) อยู่ก่อน ตัวเลข (Number) อยู่หลัง สามารถใช้ ORDER BY ร่วมกับ RLIKE (REGEXP) และ IF() ได้

รูปแบบคำสั่ง

SELECT * FROM table_name
ORDER BY IF(column_name RLIKE '^[a-zA-Z]', 1, 2), column_name;

คำอธิบาย:

  • RLIKE '^[a-zA-Z]' - ตรวจสอบว่าเริ่มต้นด้วยตัวอักษร (A-Z, a-z)
  • IF(condition, 1, 2) - ถ้าเป็นตัวอักษรให้ 1, ไม่งั้นให้ 2
  • MySQL เรียงตัวเลข 1 ก่อน 2 → กลุ่มตัวอักษรจะอยู่หน้า
  • column_name - เรียงในกลุ่มเดียวกันตามค่าปกติ

ตัวอย่างการใช้งาน

1. สร้างตารางและเพิ่มข้อมูลผสมตัวอักษร/ตัวเลข

CREATE TABLE AlphabetFirstThenNumberDemo (
    Id INT NOT NULL AUTO_INCREMENT,
    Name VARCHAR(20),
    PRIMARY KEY (Id)
);

INSERT INTO AlphabetFirstThenNumberDemo (Name) VALUES
('John'), ('Bob'), ('1Sam'), ('Carol'), ('2Larry'), ('David'), ('3Mike'), ('Robert');

ข้อมูลในตาราง (ลำดับ Insert):

+----+--------+
| Id | Name   |
+----+--------+
|  1 | John   |
|  2 | Bob    |
|  3 | 1Sam   |
|  4 | Carol  |
|  5 | 2Larry |
|  6 | David  |
|  7 | 3Mike  |
|  8 | Robert |
+----+--------+

2. เรียง: ตัวอักษรก่อน ตัวเลขทีหลัง

SELECT * FROM AlphabetFirstThenNumberDemo
ORDER BY IF(Name RLIKE '^[a-zA-Z]', 1, 2), Name;

ผลลัพธ์:

+----+--------+
| Id | Name   |
+----+--------+
|  2 | Bob    |
|  4 | Carol  |
|  6 | David  |
|  1 | John   |
|  8 | Robert |
|  3 | 1Sam   |
|  5 | 2Larry |
|  7 | 3Mike  |
+----+--------+

กลุ่มตัวอักษร (Bob, Carol, David, John, Robert) อยู่หน้า เรียง A-Z
กลุ่มตัวเลข (1Sam, 2Larry, 3Mike) อยู่หลัง เรียงตามค่าสตริง

ตัวเลือก Regex Pattern อื่นๆ

Patternความหมายใช้เมื่อ
'^[a-z]'เริ่มต้นตัวพิมพ์เล็กCase-sensitive (ต้องใช้ BINARY หรือ collation _cs)
'^[A-Z]'เริ่มต้นตัวพิมพ์ใหญ่Case-sensitive
'^[a-zA-Z]'เริ่มต้นตัวอักษร (ไม่สนใจ case)ทั่วไป (Default collation _ci)
'^[0-9]'เริ่มต้นตัวเลขกลับลำดับ: ตัวเลขก่อน
'^[^a-zA-Z0-9]'เริ่มต้นสัญลักษณ์สัญลักษณ์ก่อน ตัวอักษร/ตัวเลขทีหลัง

วิธีทางเลือก: ใช้ CASE WHEN

SELECT * FROM AlphabetFirstThenNumberDemo
ORDER BY CASE 
    WHEN Name RLIKE '^[a-zA-Z]' THEN 1
    WHEN Name RLIKE '^[0-9]' THEN 2
    ELSE 3
END, Name;

CASE WHEN อ่านง่ายกว่าและขยายเงื่อนไขได้หลายระดับ

MySQL 8.0+: ใช้ REGEXP_LIKE

SELECT * FROM AlphabetFirstThenNumberDemo
ORDER BY IF(REGEXP_LIKE(Name, '^[a-zA-Z]'), 1, 2), Name;

สรุป

ใช้ ORDER BY IF(col RLIKE '^[a-zA-Z]', 1, 2), col เพื่อเรียงตัวอักษรก่อนตัวเลข วิธีนี้ทำงานได้ใน MySQL ทุกเวอร์ชัน และปรับเปลี่ยนลำดับกลุ่มได้ยืดหยุ่น