บทนำ
เมื่อเก็บช่วงค่าในรูปสตริงคั่นด้วย 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)