Bài toán
Cột Name chứa "LastName | FirstName MiddleName", cần tách thành 2 cột: FirstName và LastName.
Dữ liệu mẫu
CREATE TABLE DemoTable (Name VARCHAR(100));
INSERT INTO DemoTable VALUES
('Chris | Bob Brown'),
('Carol | Robert Taylor'),
('Sam | David Miller');
Dữ liệu:
+-----------------------+
| Name |
+-----------------------+
| Chris | Bob Brown |
| Carol | Robert Taylor |
| Sam | David Miller |
+-----------------------+
Giải pháp dùng SUBSTRING_INDEX + REPLACE
SELECT
REPLACE(Name, SUBSTRING_INDEX(Name, ' ', -1), '') AS FirstName,
SUBSTRING_INDEX(Name, ' ', -1) AS LastName
FROM DemoTable;
Kết quả:
+-----------------+----------+
| FirstName | LastName |
+-----------------+----------+
| Chris | Bob | Brown |
| Carol | Robert | Taylor |
| Sam | David | Miller |
+-----------------+----------+
Phân tích
SUBSTRING_INDEX(Name, ' ', -1): Lấy substring sau dấu cách cuối cùng → LastName (Brown, Taylor, Miller).REPLACE(Name, LastName, ''): Xóa LastName khỏi chuỗi gốc → phần còn lại là FirstName.- Vẫn giữ dấu "|" và khoảng trắng thừa → có thể thêm
TRIM().
Cải tiến: Làm sạch dữ liệu
SELECT
TRIM(REPLACE(REPLACE(Name, SUBSTRING_INDEX(Name, ' ', -1), ''), '|', '')) AS FirstName,
TRIM(SUBSTRING_INDEX(Name, ' ', -1)) AS LastName
FROM DemoTable;
Kết quả sạch:
+---------------+----------+
| FirstName | LastName |
+---------------+----------+
| Chris Bob | Brown |
| Carol Robert | Taylor |
| Sam David | Miller |
+---------------+----------+
Lưu ý
- Giả định LastName là từ cuối cùng (sau dấu cách cuối).
- Không xử lý được tên có 2 từ LastName (ví dụ: "Van Der Berg").
- Với dữ liệu phức tạp, nên xử lý ở application layer hoặc dùng regex (MySQL 8.0:
REGEXP_SUBSTR).