Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: หาค่าสูงสุดจากสตริง alphanumeric ที่ขึ้นต้นด้วยตัวอักษรเฉพาะ

การหาค่า 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 ได้