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

Tách cột chuỗi 'ID-Name-Age' thành 3 cột riêng biệt trong MySQL (SUBSTRING_INDEX)

Vấn đề: Phân tách cột VARCHAR chứa nhiều giá trị cách nhau bằng dấu gạch ngang

Cột EmployeeInformation = '101-John-29'. Cần tách thành 3 cột: EmployeeId, EmployeeName, EmployeeAge.

Giải pháp: SUBSTRING_INDEX() lồng nhau

SUBSTRING_INDEX(str, delim, count):

  • count > 0: Lấy phần trước delimiter thứ count.
  • count < 0: Lấy phần sau delimiter thứ |count| từ cuối.

1. Tạo bảng và dữ liệu

CREATE TABLE DemoTable (EmployeeInformation TEXT);
INSERT INTO DemoTable VALUES
('101-John-29'), ('102-David-35'), ('103-Chris-28');

2. Truy vấn tách cột

SELECT 
    SUBSTRING_INDEX(EmployeeInformation, '-', 1) AS EmployeeId,
    SUBSTRING_INDEX(SUBSTRING_INDEX(EmployeeInformation, '-', 2), '-', -1) AS EmployeeName,
    SUBSTRING_INDEX(SUBSTRING_INDEX(EmployeeInformation, '-', -2), '-', -1) AS EmployeeAge
FROM DemoTable;

3. Giải thích

  • EmployeeId: SUBSTRING_INDEX(..., '-', 1) – Phần trước dấu '-' đầu tiên.
  • EmployeeName:
    1. SUBSTRING_INDEX(..., '-', 2) – Lấy 2 phần đầu: '101-John'.
    2. SUBSTRING_INDEX(..., '-', -1) – Lấy phần sau dấu '-' cuối của chuỗi đó → 'John'.
  • EmployeeAge:
    1. SUBSTRING_INDEX(..., '-', -2) – Lấy 2 phần cuối: 'John-29'.
    2. SUBSTRING_INDEX(..., '-', -1) – Lấy phần sau dấu '-' cuối → '29'.

4. Kết quả

+------------+--------------+-------------+
| EmployeeId | EmployeeName | EmployeeAge |
+------------+--------------+-------------+
| 101        | John         | 29          |
| 102        | David        | 35          |
| 103        | Chris        | 28          |
+------------+--------------+-------------+

Cách hiện đại hơn (MySQL 8.0+): JSON_TABLE hoặc REGEXP_SUBSTR

-- Nếu format cố định 3 phần
SELECT 
    TRIM(SUBSTRING_INDEX(EmployeeInformation, '-', 1)) AS EmployeeId,
    TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(EmployeeInformation, '-', 2), '-', -1)) AS EmployeeName,
    TRIM(SUBSTRING_INDEX(EmployeeInformation, '-', -1)) AS EmployeeAge
FROM DemoTable;

Thêm TRIM() để an toàn với khoảng trắng.

Lưu ý

  • Cách này phụ thuộc chặt chẽ vào format dữ liệu (đúng 2 dấu '-'). Dữ liệu bẩn sẽ sai.
  • Nên chuẩn hóa: tách thành 3 cột riêng khi thiết kế bảng.
  • Nếu phải xử lý thường xuyên, tạo VIEW hoặc Generated Column.