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:
SUBSTRING_INDEX(..., '-', 2)– Lấy 2 phần đầu: '101-John'.SUBSTRING_INDEX(..., '-', -1)– Lấy phần sau dấu '-' cuối của chuỗi đó → 'John'.
- EmployeeAge:
SUBSTRING_INDEX(..., '-', -2)– Lấy 2 phần cuối: 'John-29'.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.