Natural Sort / Alphanumeric Sort ใน MySQL
การเรียง STRING ที่มีตัวเลขผสม (เช่น '2J John has 9' vs '2J John has 58') ใช้ REGEXP_REPLACE (MySQL 8.0+) เพื่อลบตัวเลขท้าย แล้วเรียงตามความยาวและค่าอักษร
คำสั่ง
SELECT * FROM demo18
ORDER BY
REGEXP_REPLACE(value, '[0-9]*$', ''),
LENGTH(value),
value;
ตัวอย่างข้อมูล
INSERT INTO demo18 VALUES
('John Smith'), ('2J John has 58'), ('2J John has 9');
ผลลัพธ์
| value |
|---|
| 2J John has 9 |
| 2J John has 58 |
| John Smith |
คำอธิบาย:
REGEXP_REPLACE(value, '[0-9]*$', '')ลบตัวเลขท้ายสตริง → '2J John has ', '2J John has ', 'John Smith'LENGTH(value)เรียงตามความยาว (สั้นกว่าก่อน)valueเรียงตามตัวอักษร
หมายเหตุ: REGEXP_REPLACE ต้องการ MySQL 8.0+ เวอร์ชันเก่าใช้ SUBSTRING_INDEX หรือ Logic อื่นซับซ้อนกว่า