ฟังก์ชัน SUBSTRING_INDEX()
SUBSTRING_INDEX(str, delimiter, count)
count > 0: ส่วนก่อน Delimiter ครั้งที่ count
count < 0: ส่วนหลัง Delimiter ครั้งที่ |count|
ตัวอย่าง: ตาราง demo69
CREATE TABLE demo69 (name VARCHAR(40));
INSERT INTO demo69 VALUES
('John/Smith'), ('David/Miller'), ('Chris/Brown'), ('Carol/Taylor');
ข้อมูลก่อน UPDATE
+--------------+
| name |
+--------------+
| John/Smith |
| David/Miller |
| Chris/Brown |
| Carol/Taylor |
+--------------+
คำสั่ง UPDATE: เก็บเฉพาะส่วนก่อน /
UPDATE demo69
SET name = SUBSTRING_INDEX(name, '/', 1);
ผลลัพธ์หลัง UPDATE
+-------+
| name |
+-------+
| John |
| David |
| Chris |
| Carol |
+-------+
รายละเอียด SUBSTRING_INDEX
| Count | Input | Delimiter | Result |
| 1 | 'a/b/c' | '/' | 'a' |
| 2 | 'a/b/c' | '/' | 'a/b' |
| -1 | 'a/b/c' | '/' | 'c' |
| -2 | 'a/b/c' | '/' | 'b/c' |
กรณีศึกษาเพิ่มเติม
1. เก็บส่วนหลัง / (Last Name)
UPDATE demo69 SET name = SUBSTRING_INDEX(name, '/', -1);
2. Delimiter หลายตัวอักษร
SUBSTRING_INDEX('John::Smith', '::', 1) -- 'John'
3. ใช้ใน SELECT (ไม่ UPDATE)
SELECT
SUBSTRING_INDEX(name, '/', 1) AS first_name,
SUBSTRING_INDEX(name, '/', -1) AS last_name
FROM demo69;
4. จัดการ NULL และไม่มี Delimiter
SELECT
COALESCE(NULLIF(SUBSTRING_INDEX(name, '/', 1), ''), name) AS first_name
FROM demo69;
ประสิทธิภาพ
- SUBSTRING_INDEX ใช้ Full Table Scan (ไม่ใช้ INDEX)
- ตารางใหญ่: ควร Split คอลัมน์ออกมาเป็น first_name, last_name แยกกัน
- หรือใช้ Generated Column + Index (MySQL 5.7+)
ฟังก์ชัน String อื่นที่เกี่ยวข้อง
| ฟังก์ชัน | ใช้สำหรับ |
| SUBSTRING(str, pos, len) | ตัดตำแหน่งคงที่ |
| SUBSTRING_INDEX(str, delim, count) | ตัดด้วย Delimiter (แนะนำ) |
| LEFT(str, len) | ตัวอักษรซ้าย n ตัว |
| RIGHT(str, len) | ตัวอักษรขวา n ตัว |
| TRIM(str) | ตัด Space หน้า/หลัง |