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

วิธีแยกสตริงใน MySQL ด้วยฟังก์ชัน SUBSTRING_INDEX

การแยกข้อความ (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