Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Lấy phần chuỗi bên trái dựa trên vị trí dấu phân cách cuối cùng trong MySQL

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):

  1. REVERSE(Title): Đảo ngược chuỗi
  2. LOCATE('$', REVERSE(Title)): Tìm vị trí '$' đầu tiên trong chuỗi đảo = vị trí '$' cuối cùng trong chuỗi gốc
  3. CHAR_LENGTH(Title) - ...: Tính độ dài phần bên trái (trừ đi phần sau '$' cuối)
  4. 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 đó).