การแยกข้อความ (Split String) ใน MySQL โดยใช้ SUBSTRING_INDEX
MySQL ไม่มีฟังก์ชัน SPLIT_STRING แบบ built-in เหมือนภาษาโปรแกรมมิ่งอื่นๆ แต่สามารถใช้ฟังก์ชัน SUBSTRING_INDEX() ร่วมกันเพื่อแยกข้อความได้อย่างมีประสิทธิภาพ
รูปแบบฟังก์ชัน SUBSTRING_INDEX
SUBSTRING_INDEX(str, delim, count)
- str: สตริงต้นทาง
- delim: ตัวคั่น (delimiter)
- count: จำนวนครั้งที่เจอตัวคั่น (บวก = นับจากซ้าย, ลบ = นับจากขวา)
ตัวอย่าง: แยกชื่อ-นามสกุล
สร้างตารางและเพิ่มข้อมูล:
CREATE TABLE DemoTable (Name VARCHAR(40));
INSERT INTO DemoTable VALUES ('Chris Brown');
INSERT INTO DemoTable VALUES ('David Miller');
INSERT INTO DemoTable VALUES ('John Doe');
คำสั่งแยกชื่อ (First Name) และ นามสกุล (Last Name)
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(Name, ' ', 1), ' ', -1) AS StudentFirstName,
SUBSTRING_INDEX(SUBSTRING_INDEX(Name, ' ', 3), ' ', -1) AS StudentLastName
FROM DemoTable;
อธิบายตรรกะการทำงาน
| ส่วน | คำอธิบาย |
|---|---|
SUBSTRING_INDEX(Name, ' ', 1) | เอาส่วนแรกก่อน space ครั้งแรก → "Chris" |
SUBSTRING_INDEX(..., ' ', -1) | เอาส่วนสุดท้าย (ในที่นี้เหมือนเดิม) → "Chris" |
SUBSTRING_INDEX(Name, ' ', 3) | เอาส่วนทั้งหมด 3 ส่วน (ทั้งชื่อเต็ม) → "Chris Brown" |
SUBSTRING_INDEX(..., ' ', -1) | เอาส่วนหลัง space ครั้งสุดท้าย → "Brown" |
ผลลัพธ์
+------------------+-----------------+ | StudentFirstName | StudentLastName | +------------------+-----------------+ | Chris | Brown | | David | Miller | | John | Doe | +------------------+-----------------+
เทคนิคเพิ่มเติม: แยกหลายส่วน
หากต้องการแยกเป็น 3 ส่วน (เช่น ชื่อกลาง):
SELECT
SUBSTRING_INDEX(Name, ' ', 1) AS first_part,
SUBSTRING_INDEX(SUBSTRING_INDEX(Name, ' ', 2), ' ', -1) AS middle_part,
SUBSTRING_INDEX(Name, ' ', -1) AS last_part
FROM DemoTable;
ข้อจำกัดและทางเลือกอื่น
- เหมาะกับ delimiter แบบคงที่ (space, comma, dash)
- ซับซ้อนหาก delimiter ซ้ำกันหรือไม่สม่ำเสมอ
- MySQL 8.0+ สามารถใช้
REGEXP_SUBSTR()ได้ - สำหรับการประมวลผลซับซ้อน แนะนำให้ทำที่ Application Layer