Tách chuỗi theo dấu phân cách với SUBSTRING_INDEX() trong MySQL
Hàm SUBSTRING_INDEX(chuoi, dau_phan_cach, so_lan) trích xuất phần trước hoặc sau dấu phân cách thứ N.
Tạo bảng và dữ liệu
mysql> create table DemoTable ( Name varchar(40) );
mysql> insert into DemoTable values('John_Smith');
mysql> insert into DemoTable values('Carol_Taylor');
mysql> insert into DemoTable values('David_Miller');
Truy vấn tách lấy phần trước dấu '_' (Họ)
mysql> select if(locate('_',Name)=0,'',substring_index(Name, '_', 1)) from DemoTable;
Kết quả
+---------------------------------------------------------+
| if(locate('_',Name)=0,'',substring_index(Name, '_', 1)) |
+---------------------------------------------------------+
| John |
| Carol |
| David |
+---------------------------------------------------------+
Giải thích:
LOCATE('_', Name): Tìm vị trí dấu '_', trả về 0 nếu không cóIF(LOCATE=0, '', ...): Nếu không có dấu '_', trả về chuỗi rỗngSUBSTRING_INDEX(Name, '_', 1): Lấy phần trước dấu '_' đầu tiên (số dương = tính từ trái)
Lấy phần sau dấu '_' (Tên):
SELECT SUBSTRING_INDEX(Name, '_', -1) FROM DemoTable; -- Kết quả: Smith, Taylor, Miller
Tách nhiều phần (MySQL 8.0+): Dùng REGEXP_SUBSTR hoặc JSON_TABLE sau khi replace dấu phân cách thành JSON array.
Thiết kế tốt hơn: Tách sẵn thành 2 cột FirstName, LastName khi INSERT, tránh tách lúc truy vấn (chậm, dễ lỗi).