การจัดเรียง (Sorting) ข้อมูล alphanumeric ที่มีตัวเลขความยาวไม่เท่ากัน
เมื่อเรียงลำดับสตริงแบบ alphanumeric เช่น STU-MIT-10, STU-MIT-143 การเรียงแบบสตริงปกติ (lexicographic) จะได้ลำดับผิด เพราะ "10" จะอยู่ก่อน "143" แต่ "2" จะอยู่หลัง "143" บทความนี้แสดงวิธีแยกส่วนตัวเลขและแปลงเป็นตัวเลขจริงเพื่อเรียงให้ถูกต้อง
สร้างตารางและข้อมูล
mysql> create table DemoTable1623 (
-> StudentCode varchar(20)
-> );
Query OK, 0 rows affected (0.47 sec)
mysql> insert into DemoTable1623 values('STU-MIT-143');
mysql> insert into DemoTable1623 values('STU-MIT-10');
mysql> insert into DemoTable1623 values('STU-MIT-150');
mysql> insert into DemoTable1623 values('STU-MIT-148');
ข้อมูลก่อนเรียง
+-------------+ | StudentCode | +-------------+ | STU-MIT-143 | | STU-MIT-10 | | STU-MIT-150 | | STU-MIT-148 | +-------------+
คำสั่ง ORDER BY ที่ถูกต้อง
mysql> select * from DemoTable1623
-> order by substring_index(StudentCode, '-', 1),
-> substring_index(StudentCode, '-', -1) + 0;
ผลลัพธ์หลังเรียงถูกต้อง
+-------------+ | StudentCode | +-------------+ | STU-MIT-10 | | STU-MIT-143 | | STU-MIT-148 | | STU-MIT-150 | +-------------+
อธิบายการทำงาน
substring_index(StudentCode, '-', 1)— ดึงส่วนก่อนเครื่องหมาย - ตัวแรก (คือSTU) ใช้จัดกลุ่มหลักsubstring_index(StudentCode, '-', -1)— ดึงส่วนหลังเครื่องหมาย - ตัวสุดท้าย (คือตัวเลข10,143, ...)+ 0— แปลงสตริงตัวเลขให้เป็นตัวเลขจริง (numeric context) เพื่อให้เรียงเป็นตัวเลข ไม่ใช่สตริง
ขยายใช้งาน: รูปแบบซับซ้อนกว่า
หากรูปแบบเป็น ABC-123-XYZ-45 และต้องการเรียงตามตัวเลขสุดท้าย:
ORDER BY
SUBSTRING_INDEX(StudentCode, '-', 1), -- ABC
SUBSTRING_INDEX(SUBSTRING_INDEX(StudentCode, '-', 2), '-', -1) + 0, -- 123
SUBSTRING_INDEX(StudentCode, '-', -1) + 0 -- 45
เคล็ดลับ: ใน MySQL 8.0+ สามารถใช้ CAST(... AS UNSIGNED) แทน + 0 เพื่อความชัดเจนมากขึ้น