Vấn đề: Parse chuỗi phức tạp để lấy số nhúng giữa các đoạn text
Chuỗi: 'You_can_remove_the_string_part_only-10001-But_You_can_not_remove_the_numeric_parts'. Cần lấy số 10001.
Giải pháp: REPLACE lồng nhau + CAST
Loại bỏ phần tiền tố và hậu tố cố định, chuyển phần còn lại thành số.
1. Tạo bảng và dữ liệu
CREATE TABLE DemoTable (Title TEXT);
INSERT INTO DemoTable VALUES
('You_can_remove_the_string_part_only-10001-But_You_can_not_remove_the_numeric_parts');
2. Truy vấn trích xuất số
SELECT CAST(
REPLACE(
REPLACE(Title,
'You_can_remove_the_string_part_only-', ''),
'-But_You_can_not_remove_the_numeric_parts', ''
) AS UNSIGNED
) AS Output
FROM DemoTable;
3. Giải thích
REPLACE(Title, 'prefix-', '')– Xóa tiền tố cố định.REPLACE(..., '-suffix', '')– Xóa hậu tố cố định.CAST(... AS UNSIGNED)– Chuyển chuỗi số thành kiểu số nguyên.
4. Kết quả
+--------+
| Output |
+--------+
| 10001 |
+--------+
Cách tổng quát hơn (MySQL 8.0+): REGEXP_SUBSTR
SELECT CAST(REGEXP_SUBSTR(Title, '[0-9]+') AS UNSIGNED) AS Output
FROM DemoTable;
REGEXP_SUBSTR(str, pattern)– Trả về chuỗi con khớp regex đầu tiên.'[0-9]+'– Dãy số liên tiếp đầu tiên.- Lin hoạt hơn, không cần biết tiền tố/hậu tố chính xác.
Lưu ý
- Cách REPLACE chỉ dùng khi format chuỗi rất cố định.
- Dữ liệu thực tế thường không đều đặn – ưu tiên REGEXP hoặc xử lý ở application layer.
- MySQL < 8.0 không có REGEXP_SUBSTR – phải dùng REPLACE/SUBSTRING_INDEX phức tạp.