ใช้ SUBSTRING_INDEX() และ REPLACE() แยกชื่อ
เมื่อข้อมูลชื่อเก็บในรูปแบบ "LastName | FirstName MiddleName" ในคอลัมน์เดียว สามารถแยกได้ด้วย String Functions
ตัวอย่างข้อมูล
CREATE TABLE DemoTable (Name VARCHAR(100));
INSERT INTO DemoTable VALUES
('Chris | Bob Brown'),
('Carol | Robert Taylor'),
('Sam | David Miller');
ข้อมูลต้นฉบับ:
+-----------------------+
| Name |
+-----------------------+
| Chris | Bob Brown |
| Carol | Robert Taylor |
| Sam | David Miller |
+-----------------------+
Query แยก FirstName และ LastName
SELECT
REPLACE(Name, SUBSTRING_INDEX(Name, ' ', -1), '') AS FirstName,
SUBSTRING_INDEX(Name, ' ', -1) AS LastName
FROM DemoTable;
ผลลัพธ์:
+-----------------+----------+
| FirstName | LastName |
+-----------------+----------+
| Chris | Bob | Brown |
| Carol | Robert | Taylor |
| Sam | David | Miller |
+-----------------+----------+
อธิบาย Logic
SUBSTRING_INDEX(Name, ' ', -1)- หาคำสุดท้าย (LastName) โดยนับจากขวา (-1)REPLACE(Name, [LastName], '')- ลบ LastName ออกจากสตริงเดิม เหลือ FirstName + MiddleName
⚠️ ปัญหาของวิธีนี้
ผลลัพธ์ FirstName ยังคงมี | และ Space ค้างอยู่ (เช่น "Chris | Bob ")
วิธีที่ดีกว่า: ใช้ SUBSTRING_INDEX 2 ครั้ง
SELECT
TRIM(SUBSTRING_INDEX(Name, '|', 1)) AS FirstName,
TRIM(SUBSTRING_INDEX(Name, '|', -1)) AS LastName
FROM DemoTable;
ผลลัพธ์ที่ถูกต้อง:
+-----------+------------+
| FirstName | LastName |
+-----------+------------+
| Chris | Bob Brown |
| Carol | Robert Taylor |
| Sam | David Miller |
+-----------+------------+
อธิบายวิธีที่ดีกว่า
SUBSTRING_INDEX(Name, '|', 1)- ส่วนก่อน | (FirstName)SUBSTRING_INDEX(Name, '|', -1)- ส่วนหลัง | (LastName)TRIM()- ตัด Space นำหน้า/ท้าย
กรณีซับซ้อน: แยก First, Middle, Last แยกกัน
SELECT
TRIM(SUBSTRING_INDEX(Name, '|', 1)) AS FirstName,
TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(Name, '|', -1), ' ', 1)) AS MiddleName,
TRIM(SUBSTRING_INDEX(Name, ' ', -1)) AS LastName
FROM DemoTable;
สำหรับข้อมูลจริง แนะนำเก็บ FirstName, MiddleName, LastName แยกคอลัมน์ตั้งแต่แรก จะ Query และ Index ได้ง่ายกว่ามาก