บทนำ
การแยกเฉพาะตัวเลขจากสตริงที่ผสมตัวอักษรและตัวเลข (เช่น 'John19383' → '19383') สามารถทำได้ด้วยการรวมฟังก์ชัน REVERSE(), FORMAT(), REPLACE() โดยไม่ต้องใช้ REGEXP
ตัวอย่างการสร้างตารางและเพิ่มข้อมูล
mysql> CREATE TABLE DemoTable (
-> StudentId VARCHAR(100)
-> );
Query OK, 0 rows affected (0.71 sec)
mysql> INSERT INTO DemoTable VALUES('John19383');
mysql> INSERT INTO DemoTable VALUES('Carol9999');
mysql> INSERT INTO DemoTable VALUES('David123456');
แสดงข้อมูลทั้งหมด
mysql> SELECT * FROM DemoTable;
ผลลัพธ์
+-------------+
| StudentId |
+-------------+
| John19383 |
| Carol9999 |
| David123456 |
+-------------+
3 rows in set (0.00 sec)
คำสั่งแยกตัวเลข (สมมติตัวเลขอยู่ท้ายสตริง)
mysql> SELECT REPLACE(REVERSE(FORMAT(REVERSE(StudentId), 0)), ',', '') AS OnlyDigit
-> FROM DemoTable;
ผลลัพธ์
+-----------+
| OnlyDigit |
+-----------+
| 19383 |
| 9999 |
| 123456 |
+-----------+
3 rows in set (0.05 sec)
คำอธิบายการทำงาน (Inside-Out)
REVERSE(StudentId)- กลับสตริง: '38391nhoJ'FORMAT(..., 0)- จัดรูปแบบตัวเลขพร้อมคอมม่า: '38,391' (ทำงานได้เพราะนำหน้าตัวเลข)REVERSE(...)- กลับกลับมา: '19,383'REPLACE(..., ',', '')- ลบคอมม่า: '19383'
ข้อจำกัด
- ทำงานได้ก็ต่อเมื่อตัวเลขอยู่ **ท้ายสตริง** และไม่มีคอมม่าในข้อมูลต้นฉบับ
- หากตัวเลขอยู่หน้า/กลาง/หลายกลุ่ม วิธีนี้จะไม่ถูกต้อง
วิธีที่ทันสมัยกว่า (MySQL 8.0+)
-- ใช้ REGEXP_REPLACE (MySQL 8.0.4+)
SELECT REGEXP_REPLACE(StudentId, '[^0-9]', '') AS OnlyDigits FROM DemoTable;
-- หรือใช้ REGEXP_SUBSTR
SELECT REGEXP_SUBSTR(StudentId, '[0-9]+$') AS TrailingDigits FROM DemoTable;