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

แยก First Name และ Last Name จากคอลัมน์เดียวใน MySQL

ใช้ 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

  1. SUBSTRING_INDEX(Name, ' ', -1) - หาคำสุดท้าย (LastName) โดยนับจากขวา (-1)
  2. 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 ได้ง่ายกว่ามาก