Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tách họ và tên từ 1 cột thành 2 cột trong MySQL

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).