MySQL có một số hàm và toán tử cho phép chúng ta thực hiện các thao tác sử dụng biểu thức chính quy (regex). Bài viết này trình bày hai toán tử và một hàm cho phép chúng tôi tìm hiểu xem một chuỗi có khớp với một biểu thức chính quy được chỉ định bởi một mẫu nhất định hay không.
Các hàm và toán tử regex này là:
-
REGEXP_LIKE()
-
REGEXP
-
RLIKE
Về cơ bản, tất cả chúng đều tương đương nhau, vì các toán tử (hai toán tử thứ hai) đều là từ đồng nghĩa của hàm (toán tử đầu tiên). Trong mọi trường hợp, bạn có thể xem các ví dụ về cả ba hoạt động bên dưới.
REGEXP_LIKE()
Chức năng
Đầu tiên, hãy xem xét chức năng. Đây là một ví dụ về việc chạy tìm kiếm regex bằng REGEXP_LIKE()
chức năng:
SELECT REGEXP_LIKE('Car', '^C') AS 'Match', REGEXP_LIKE('Bar', '^C') AS 'No Match';
Kết quả:
+-------+----------+ | Match | No Match | +-------+----------+ | 1 | 0 | +-------+----------+
Chuỗi đầu tiên phù hợp (vì nó bắt đầu bằng C ) nên kết quả là 1
. Chuỗi thứ hai không khớp và do đó kết quả là 0
.
Tuy nhiên, hàm này có thể hữu ích hơn nhiều so với việc chỉ trả về 1
hoặc 0
. Ví dụ:nó có thể được thêm vào WHERE
mệnh đề khi truy vấn cơ sở dữ liệu. Trong trường hợp này, chúng ta có thể nhận được danh sách các hàng có chứa mẫu phù hợp.
Đây là một ví dụ:
SELECT AlbumId, AlbumName FROM Albums WHERE REGEXP_LIKE(AlbumName, '^Power');
Kết quả:
+---------+------------+ | AlbumId | AlbumName | +---------+------------+ | 1 | Powerslave | | 2 | Powerage | +---------+------------+
Đây là bảng đầy đủ:
SELECT AlbumId, AlbumName FROM Albums;
Kết quả:
+---------+--------------------------+ | AlbumId | AlbumName | +---------+--------------------------+ | 1 | Powerslave | | 2 | Powerage | | 3 | Singing Down the Lane | | 4 | Ziltoid the Omniscient | | 5 | Casualties of Cool | | 6 | Epicloud | | 7 | Somewhere in Time | | 8 | Piece of Mind | | 9 | Killers | | 10 | No Prayer for the Dying | | 11 | No Sound Without Silence | | 12 | Big Swing Face | | 13 | Blue Night | | 14 | Eternity | | 15 | Scandinavia | | 16 | Long Lost Suitcase | | 17 | Praise and Blame | | 18 | Along Came Jones | | 19 | All Night Wrong | | 20 | The Sixteen Men of Tain | +---------+--------------------------+
REGEXP
Nhà điều hành
Dưới đây là cách thực hiện điều tương tự bằng cách sử dụng REGEXP
nhà điều hành:
SELECT 'Car' REGEXP '^C' AS 'Match', 'Bar' REGEXP '^C' AS 'No Match';
Kết quả:
+-------+----------+ | Match | No Match | +-------+----------+ | 1 | 0 | +-------+----------+
Và ví dụ về cơ sở dữ liệu:
SELECT AlbumId, AlbumName FROM Albums WHERE AlbumName REGEXP '^Power';
Kết quả:
+---------+------------+ | AlbumId | AlbumName | +---------+------------+ | 1 | Powerslave | | 2 | Powerage | +---------+------------+
Bạn cũng có thể sử dụng NOT REGEXP
để trả về kết quả ngược lại.
RLIKE
Nhà điều hành
Và đây nó đang sử dụng RLIKE
:
SELECT 'Car' RLIKE '^C' AS 'Match', 'Bar' RLIKE '^C' AS 'No Match';
Kết quả:
+-------+----------+ | Match | No Match | +-------+----------+ | 1 | 0 | +-------+----------+
Và ví dụ về cơ sở dữ liệu:
SELECT AlbumId, AlbumName FROM Albums WHERE AlbumName RLIKE '^Power';
Kết quả:
+---------+------------+ | AlbumId | AlbumName | +---------+------------+ | 1 | Powerslave | | 2 | Powerage | +---------+------------+
Trong trường hợp này, tôi chỉ cần hoán đổi REGEXP
cho RLIKE
và để yên phần còn lại của mã.
Bạn cũng có thể sử dụng NOT RLIKE
để trả về kết quả ngược lại.
Các chức năng khác của REGEX
MySQL cũng bao gồm một số hàm và toán tử regex khác. Ba trong số này được liệt kê dưới đây. Về mặt kỹ thuật, bạn cũng có thể sử dụng hai cách đầu tiên để “phát hiện” xem một chuỗi có khớp với mẫu regex hay không (trong trường hợp đó, có lẽ bài viết này nên có tiêu đề “5 cách phát hiện xem chuỗi có khớp với biểu thức chính quy trong MySQL” thay vì chỉ “ 3 cách… ”).
Dù sao, đây là ba hàm regex khác:
- Bạn có thể sử dụng
REGEXP_INSTR()
hàm để trả về chỉ số bắt đầu của một chuỗi con phù hợp với mẫu biểu thức chính quy. -
REGEXP_SUBSTR()
hàm trả về chuỗi con phù hợp với mẫu biểu thức chính quy đã cho. - Và
REGEXP_REPLACE()
hàm thay thế các lần xuất hiện của chuỗi con trong một chuỗi khớp với mẫu biểu thức chính quy đã cho.