Hầu hết các DBMS chính cung cấp cho chúng ta một cách để tìm một chuỗi trong một chuỗi bằng cách sử dụng SQL. Ý tôi là sử dụng truy vấn SQL để tìm vị trí của một chuỗi con trong một chuỗi.
Có một số hàm SQL cho phép chúng tôi thực hiện việc này, bao gồm INSTR()
, LOCATE()
, POSITION()
và CHARINDEX()
. Chức năng bạn sử dụng sẽ phụ thuộc vào DBMS của bạn và có thể bạn có cần chỉ định vị trí bắt đầu hay không.
Oracle
Oracle có INSTR()
hàm trả về vị trí bắt đầu của một chuỗi con đã cho trong một chuỗi.
Ví dụ:
SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;
Kết quả:
5
Điều này cho chúng ta thấy rằng chuỗi con fat
bắt đầu ở vị trí 5 trong chuỗi Big fat cat
.
Có thể chỉ định vị trí bắt đầu bằng cách chuyển đối số thứ ba. Chúng ta cũng có thể chuyển đối số thứ tư để chỉ định sự xuất hiện nào cần tìm:
SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;
Kết quả:
7
Trong trường hợp này, tôi bắt đầu tìm kiếm ở vị trí 1
và tìm kiếm lần xuất hiện thứ hai (bằng cách sử dụng 2
như đối số thứ tư).
Oracle cũng có INSTRB()
hàm thực hiện một điều tương tự, ngoại trừ việc nó trả về vị trí dựa trên byte.
MySQL
MySQL có INSTR()
chức năng tương tự như chức năng cùng tên của Cơ sở dữ liệu Oracle:
SELECT INSTR('Cats and dogs like to run', 'dogs');
Kết quả:
10
Tuy nhiên, nếu bạn cần chỉ định vị trí bắt đầu, bạn sẽ cần sử dụng LOCATE()
hoặc POSITION()
:
SELECT LOCATE('cat', 'One cat jumped over the other cat', 6);
Kết quả:
31
Đây, lần xuất hiện đầu tiên của cat
bắt đầu ở vị trí 5, nhưng tôi đã chỉ định tìm kiếm bắt đầu ở vị trí 6. Do đó, vị trí của lần xuất hiện tiếp theo của chuỗi đó là vị trí đã được trả về.
Lưu ý rằng, mặc dù tìm kiếm bắt đầu ở vị trí 6, hàm vẫn trả về vị trí của chuỗi con trong chuỗi - không phải từ vị trí bắt đầu.
POSITION()
hàm là một từ đồng nghĩa với cú pháp hai đối số của LOCATE()
, nhưng với cú pháp hơi khác (POSITION()
không cho phép chúng tôi chỉ định vị trí bắt đầu).
MySQL cũng có REGEX_INSTR()
hàm trả về chỉ mục bắt đầu của chuỗi con của chuỗi khớp với biểu thức chính quy được chỉ định bởi mẫu đã chỉ định.
MariaDB
Giống như MySQL, MariaDB cũng có INSTR()
cũng như a LOCATE()
và POSITION()
chức năng:
SELECT
INSTR('No news is good news', 'news') AS "INSTR",
POSITION('news' IN 'No news is good news') AS "POSITION",
LOCATE('news', 'No news is good news') AS "LOCATE 1",
LOCATE('news', 'No news is good news', 5) AS "LOCATE 2";
Kết quả:
+-------+----------+----------+----------+ | INSTR | POSITION | LOCATE 1 | LOCATE 2 | +-------+----------+----------+----------+ | 4 | 4 | 4 | 17 | +-------+----------+----------+----------+
MariaDB cũng có REGEX_INSTR()
hàm trả về chỉ mục bắt đầu của chuỗi con của chuỗi khớp với biểu thức chính quy được chỉ định bởi mẫu đã chỉ định.
Máy chủ SQL
Khi nói đến SQL Server, CHARINDEX()
chức năng là những gì chúng tôi đang tìm kiếm:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Kết quả:
17
Trong trường hợp này, tôi đã sử dụng đối số thứ ba tùy chọn để chỉ định vị trí bắt đầu.
SQL Server cũng có PATINDEX()
hàm tìm kiếm một mẫu trong một chuỗi.
SQLite
SQLite có INSTR()
chức năng để thỏa mãn nhu cầu của chúng tôi:
SELECT INSTR('Black cat', 'lack');
Kết quả:
2
PostgreSQL
Trong PostgreSQL, chúng ta cần sử dụng POSITION()
chức năng:
SELECT POSITION('Break' IN 'Bangkok Breaking');
Kết quả:
9