Cắt chuỗi lấy phần bên trái của dấu phân cách xuất hiện cuối cùng
Kết hợp LEFT(), CHAR_LENGTH(), LOCATE() và REVERSE() để tìm vị trí dấu phân cách cuối cùng và cắt chuỗi.
1. Tạo bảng và chèn dữ liệu phức tạp
mysql> CREATE TABLE DemoTable (Title TEXT);
mysql> INSERT INTO DemoTable VALUES
('$/This$is[MySQL]$/MySQL[FirstClass]$MySQL[SecondClass]'),
('$/This$is[Java]$/Java[FirstClass]$Java[SecondClass]');
2. Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+--------------------------------------------------------+ | Title | +--------------------------------------------------------+ | $/This$is[MySQL]$/MySQL[FirstClass]$MySQL[SecondClass] | | $/This$is[Java]$/Java[FirstClass]$Java[SecondClass] | +--------------------------------------------------------+
3. Truy vấn: Lấy phần bên trái dấu '$' cuối cùng
mysql> SELECT LEFT(Title, CHAR_LENGTH(Title) - LOCATE('$', REVERSE(Title))) AS result
FROM DemoTable;
4. Kết quả
+-------------------------------------+ | result | +-------------------------------------+ | $/This$is[MySQL]$/MySQL[FirstClass] | | $/This$is[Java]$/Java[FirstClass] | +-------------------------------------+
Giải thích từng bước (từ trong ra ngoài):
REVERSE(Title): Đảo ngược chuỗiLOCATE('$', REVERSE(Title)): Tìm vị trí '$' đầu tiên trong chuỗi đảo = vị trí '$' cuối cùng trong chuỗi gốcCHAR_LENGTH(Title) - ...: Tính độ dài phần bên trái (trừ đi phần sau '$' cuối)LEFT(Title, ...): Cắt lấy phần bên trái
Ví dụ minh họa chuỗi 1:
- Gốc:
$/This$is[MySQL]$/MySQL[FirstClass]$MySQL[SecondClass] - Đảo:
ssalC[doceS]LQSyM$ssalC[tsriF]LQSyM$/]LQSyM[si$siht/$ - LOCATE('$') = 15 (vị trí '$' đầu tiên trong chuỗi đảo)
- CHAR_LENGTH = 58
- LEFT(..., 58-15=43) → 43 ký tự đầu =
$/This$is[MySQL]$/MySQL[FirstClass]
MySQL 8.0+ dùng REGEXP_SUBSTR (đơn giản hơn):
SELECT REGEXP_SUBSTR(Title, '^.*\\$(?=[^$]*$)') FROM DemoTable;
Regex: Từ đầu (^) lấy tất cả (.*) đến $ cuối cùng (lookahead đảm bảo không có $ sau đó).