เมื่อต้องการเรียงข้อมูลให้ ตัวอักษร (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 ทุกเวอร์ชัน และปรับเปลี่ยนลำดับกลุ่มได้ยืดหยุ่น