การหาค่า MAX จากสตริง alphanumeric ที่มีคำนำหน้า (Prefix) เฉพาะ
เมื่อคอลัมน์เก็บรหัสแบบ IT794, AT1034 และต้องการหาค่าตัวเลขสูงสุดของ prefix เฉพาะ (เช่น IT) ใช้ RLIKE กรอง + SUBSTR ตัด prefix + CAST แปลงเป็นตัวเลข + MAX
สร้างตารางและข้อมูล
mysql> create table DemoTable1381 (
-> DepartmentId varchar(40)
-> );
Query OK, 0 rows affected (0.48 sec)
mysql> insert into DemoTable1381 values('IT794');
mysql> insert into DemoTable1381 values('AT1034');
mysql> insert into DemoTable1381 values('IT967');
mysql> insert into DemoTable1381 values('IT874');
mysql> insert into DemoTable1381 values('AT967');
ข้อมูลทั้งหมด
+--------------+ | DepartmentId | +--------------+ | IT794 | | AT1034 | | IT967 | | IT874 | | AT967 | +--------------+
คำสั่ง SQL หาค่าสูงสุดของ prefix 'IT'
mysql> select max(cast(substr(trim(DepartmentId), 3) as unsigned))
-> from DemoTable1381
-> where DepartmentId RLIKE '^IT';
ผลลัพธ์
+-----------------------------------------------------+ | max(cast(substr(trim(DepartmentId), 3) as unsigned)) | +-----------------------------------------------------+ | 967 | +-----------------------------------------------------+
อธิบายแต่ละส่วน
RLIKE '^IT'— Regular expression: เริ่มต้นด้วย IT (คีรี ^ = เริ่มสตริง)trim(DepartmentId)— ตัดช่องว่างนำ/ท้าย (ป้องกันข้อมูลสกปรก)substr(..., 3)— ตัด 2 ตัวอักษรแรก (IT) ออก เหลือตัวเลขcast(... as unsigned)— แปลงสตริงเป็นตัวเลขไม่มีเครื่องหมายmax(...)— หาค่าสูงสุด
การปรับปรุงสำหรับ Prefix ความยาวไม่คงที่
หาก prefix ไม่ใช่ 2 ตัวอักษรคงที่ ใช้ substring_index หรือ replace:
-- หาก prefix คั่นด้วย - เช่น IT-794
MAX(CAST(SUBSTRING_INDEX(DepartmentId, '-', -1) AS UNSIGNED))
-- หรือลบ prefix ที่รู้จักทั้งหมด
MAX(CAST(REPLACE(REPLACE(DepartmentId, 'IT', ''), 'AT', '') AS UNSIGNED))
แนวทางปฏิบัติที่ดีกว่า: แยกเก็บ prefix และ running number ในคอลัมน์ต่างกัน (Normalized design) จะทำให้ query เรียบง่าย เร็ว และรองรับ index ได้