เมื่อต้องการเรียงลำดับข้อมูลที่มีรูปแบบเฉพาะและมีอักขระคั่น (Delimiter) สามารถใช้ฟังก์ชัน SUBSTRING() ร่วมกับ CAST() เพื่อแยกส่วนตัวเลขและแปลงเป็นตัวเลขเพื่อเรียงลำดับได้อย่างถูกต้อง
ตัวอย่างการสร้างตารางและข้อมูล
1. สร้างตาราง DemoTable
mysql> CREATE TABLE DemoTable (
Value VARCHAR(40)
);
Query OK, 0 rows affected (0.59 sec)
2. เพิ่มข้อมูลทดสอบ
mysql> INSERT INTO DemoTable VALUES('2321/78/54-6');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable VALUES('2321/78/54-8');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO DemoTable VALUES('2321/78/54-5');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DemoTable VALUES('2321/78/54-9');
Query OK, 1 row affected (0.21 sec)
3. ข้อมูลก่อนเรียงลำดับ
mysql> SELECT * FROM DemoTable; +--------------+ | Value | +--------------+ | 2321/78/54-6 | | 2321/78/54-8 | | 2321/78/54-5 | | 2321/78/54-9 | +--------------+
4. คำสั่งเรียงลำดับด้วย SUBSTRING และ CAST
mysql> SELECT * FROM DemoTable
-> WHERE Value LIKE '2321/78/54%'
-> ORDER BY SUBSTRING(Value FROM 1 FOR 10),
-> CAST(SUBSTRING(Value FROM 11) AS DECIMAL);
คำอธิบายคำสั่ง:
SUBSTRING(Value FROM 1 FOR 10): ดึง 10 ตัวอักษรแรก (ส่วนคงที่:2321/78/54)SUBSTRING(Value FROM 11): ดึงตัวอักษรตั้งแต่ตำแหน่งที่ 11 เป็นต้นไป (ส่วนตัวเลขสุดท้าย:6,8,5,9)CAST(... AS DECIMAL): แปลงสตริงตัวเลขเป็นตัวเลขจริงเพื่อเรียงลำดับตัวเลขได้ถูกต้อง (5, 6, 8, 9)
5. ผลลัพธ์หลังเรียงลำดับ
+--------------+ | Value | +--------------+ | 2321/78/54-5 | | 2321/78/54-6 | | 2321/78/54-8 | | 2321/78/54-9 | +--------------+
สรุป
เทคนิคนี้เหมาะสำหรับข้อมูลที่มีรูปแบบคงที่ (Fixed Pattern) และต้องการเรียงลำดับตามส่วนที่เป็นตัวเลขท้ายสุด โดยการแยกส่วนคงที่และส่วนตัวเลข แล้วแปลงส่วนตัวเลขเป็นชนิดข้อมูลตัวเลขก่อนเรียงลำดับ