Vấn đề: Trích xuất chuỗi con bên TRÁI dấu cách cuối cùng
Cột FullName như 'Adam Smith', 'Robert Downey, Jr.'. Cần lấy phần trước dấu cách cuối: 'Adam', 'Robert Downey,'.
Giải pháp: LEFT + LENGTH + LOCATE + REVERSE
Tìm vị trí dấu cách cuối bằng cách reverse chuỗi, tìm dấu cách đầu tiên.
1. Tạo bảng và dữ liệu
CREATE TABLE DemoTable (FullName VARCHAR(50));
INSERT INTO DemoTable VALUES
('Adam Smith'), ('Robert Downey, Jr.'), ('Sylvester Stallone'), ('Chris Hemsworth');
2. Truy vấn
SELECT LEFT(FullName, LENGTH(FullName) - LOCATE(' ', REVERSE(FullName)) + 1)
FROM DemoTable;
3. Giải thích công thức
REVERSE(FullName)– Đảo chuỗi: 'htimS madA', '.rJ ,yenwoD treboR'...LOCATE(' ', REVERSE(...))– Vị trí dấu cách đầu tiên trong chuỗi đảo = vị trí dấu cách cuối trong chuỗi gốc (tính từ đầu chuỗi đảo).LENGTH(FullName) - vị_trí + 1– Độ dài phần cần lấy (giữ lại dấu cách cuối).LEFT(FullName, độ_dài)– Cắt phần trái.
4. Kết quả
+---------------------------------------------------------------------+
| LEFT(FullName, LENGTH(FullName) - LOCATE(' ', REVERSE(FullName))+1) |
+---------------------------------------------------------------------+
| Adam |
| Robert Downey, |
| Sylvester |
| Chris |
+---------------------------------------------------------------------+
Cách đơn giản hơn (MySQL 8.0+): SUBSTRING_INDEX
SELECT SUBSTRING_INDEX(FullName, ' ',
LENGTH(FullName) - LENGTH(REPLACE(FullName, ' ', '')))
FROM DemoTable;
Đếm số dấu cách = LENGTH(FullName) - LENGTH(REPLACE(FullName, ' ', '')), lấy phần trước dấu cách thứ N (N = số dấu cách).
Lưu ý
- Công thức phức tạp, khó bảo trì. Cân nhắc tách cột
FirstName,LastNamekhi thiết kế bảng. - Xử lý tên phức tạp (middle name, suffix Jr./Sr.) tốt nhất bằng thư viện chuyên dụng ở application layer.