Cú pháp
Sử dụng SUBSTRING_INDEX() với delimiter là khoảng trắng và count = 1:
SELECT SUBSTRING_INDEX(ten_cot, ' ', 1) AS tu_dau_tien FROM ten_bang;
Ví dụ chi tiết
1. Tạo bảng
mysql> CREATE TABLE FirstWordDemo ( -> AllWords LONGTEXT -> ); Query OK, 0 rows affected (0.83 sec)
2. Chèn dữ liệu
mysql> INSERT INTO FirstWordDemo VALUES('This is the first MySQL Query');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO FirstWordDemo VALUES('MySQL is a Relational Database');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO FirstWordDemo VALUES('FirstWord is not correct');
Query OK, 1 row affected (0.21 sec)
3. Dữ liệu gốc
mysql> SELECT * FROM FirstWordDemo;
+--------------------------------+ | AllWords | +--------------------------------+ | This is the first MySQL Query | | MySQL is a Relational Database | | FirstWord is not correct | +--------------------------------+ 3 rows in set (0.00 sec)
4. Lấy từ đầu tiên
mysql> SELECT SUBSTRING_INDEX(AllWords, ' ', 1) AS MyFirstWordResult FROM FirstWordDemo;
+-------------------+ | MyFirstWordResult | +-------------------+ | This | | MySQL | | FirstWord | +-------------------+ 3 rows in set (0.00 sec)
Giải thích SUBSTRING_INDEX
SUBSTRING_INDEX(str, delim, count) -- count > 0: Trả về phần trước delimiter thứ count (từ trái sang) -- count < 0: Trả về phần sau delimiter thứ |count| (từ phải sang)
| Ví dụ | Kết quả | Giải thích |
|---|---|---|
| SUBSTRING_INDEX('a.b.c', '.', 1) | a | Phần trước dấu chấm đầu |
| SUBSTRING_INDEX('a.b.c', '.', 2) | a.b | Phần trước dấu chấm thứ 2 |
| SUBSTRING_INDEX('a.b.c', '.', -1) | c | Phần sau dấu chấm cuối |
| SUBSTRING_INDEX('a.b.c', '.', -2) | b.c | Phần sau dấu chấm倒 số 2 |
Lấy từ cuối cùng
SELECT SUBSTRING_INDEX(ten_cot, ' ', -1) AS tu_cuoi_cung FROM ten_bang;
Ứng dụng thực tế
Tách họ và tên (giả định: Họ là từ đầu, Tên là phần còn lại)
SELECT
full_name,
SUBSTRING_INDEX(full_name, ' ', 1) AS ho,
TRIM(SUBSTRING(full_name, LENGTH(SUBSTRING_INDEX(full_name, ' ', 1)) + 2)) AS ten
FROM users;
Lấy domain từ email (phương pháp khác)
SELECT SUBSTRING_INDEX(email, '@', -1) AS domain FROM users;
Lấy phần mở rộng file
SELECT SUBSTRING_INDEX(filename, '.', -1) AS extension FROM files;
Lưu ý
- Delimiter là chuỗi, không phải regex
- Nhiều khoảng trắng liên tiếp: Cần
TRIM()hoặcREPLACE()trước - Chuỗi không có delimiter: Trả về toàn bộ chuỗi (count > 0) hoặc rỗng (count < 0)
- Hiệu năng tốt, có thể dùng trong WHERE/ORDER BY