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

หาค่าต่ำสุดและสูงสุดจากตัวเลขในสตริงที่คั่นด้วย Hyphen ใน MySQL

บทนำ

เมื่อเก็บช่วงค่าในรูปสตริงคั่นด้วย Hyphen (เช่น '10-20', '200-100') และต้องการหาค่าต่ำสุด (Min) ของส่วนหน้า และค่าสูงสุด (Max) ของส่วนหลัง สามารถใช้ SUBSTRING_INDEX() แยกส่วน แล้วใช้ MIN()/MAX()

ตัวอย่างการสร้างตารางและเพิ่มข้อมูล

mysql> CREATE TABLE DemoTable (
    -> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Value VARCHAR(100)
    -> );
Query OK, 0 rows affected (0.76 sec)
mysql> INSERT INTO DemoTable(Value) VALUES('10-20');
mysql> INSERT INTO DemoTable(Value) VALUES('200-100');
mysql> INSERT INTO DemoTable(Value) VALUES('780-235');

แสดงข้อมูลทั้งหมด

mysql> SELECT * FROM DemoTable;

ผลลัพธ์

+----+---------+
| Id | Value   |
+----+---------+
| 1  | 10-20   |
| 2  | 200-100 |
| 3  | 780-235 |
+----+---------+
3 rows in set (0.00 sec)

คำสั่งหา Min ของส่วนหน้า และ Max ของส่วนหลัง

mysql> SELECT 
    -> MIN(SUBSTRING_INDEX(Value, '-', 1)) AS MinFirstPart,
    -> MAX(SUBSTRING_INDEX(Value, '-', -1)) AS MaxSecondPart
    -> FROM DemoTable;

ผลลัพธ์

+----------------+-----------------+
| MinFirstPart   | MaxSecondPart   |
+----------------+-----------------+
| 10             | 235             |
+----------------+-----------------+
1 row in set (0.04 sec)

คำอธิบาย SUBSTRING_INDEX

  • SUBSTRING_INDEX(Value, '-', 1) - ส่วนก่อน Hyphen ตัวแรก (Left part)
  • SUBSTRING_INDEX(Value, '-', -1) - ส่วนหลัง Hyphen ตัวสุดท้าย (Right part)
  • ผลลัพธ์เป็น VARCHAR → MIN/MAX เปรียบเทียบแบบ String (Lexicographic)

⚠️ ข้อควรระวัง: การเปรียบเทียบ String vs Number

-- String comparison: '100' < '20' (เพราะ '1' < '2')
-- Number comparison: 100 > 20

แก้ไข: แปลงเป็นตัวเลขก่อน (CAST)

SELECT 
    MIN(CAST(SUBSTRING_INDEX(Value, '-', 1) AS UNSIGNED)) AS MinFirst,
    MAX(CAST(SUBSTRING_INDEX(Value, '-', -1) AS UNSIGNED)) AS MaxSecond
FROM DemoTable;

กรณีมีหลาย Hyphen (ใช้ SUBSTRING_INDEX ตัวที่ N)

-- ส่วนที่ 2 (ระหว่าง Hyphen ตัวที่ 1 และ 2)
SUBSTRING_INDEX(SUBSTRING_INDEX(Value, '-', 2), '-', -1)

-- ส่วนสุดท้าย
SUBSTRING_INDEX(Value, '-', -1)