Trong SQL Server, bạn có thể sử dụng T-SQL CHARINDEX()
hoặc hàm PATINDEX()
hàm để tìm một chuỗi trong một chuỗi khác. Dưới đây là tổng quan nhanh về từng chức năng.
Hàm CHARINDEX ()
Hàm này chấp nhận 3 đối số; chuỗi cần tìm, chuỗi cần tìm và vị trí bắt đầu tùy chọn.
CHARINDEX()
cú pháp như sau:
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
Ở đâu expressionToFind là biểu thức bạn muốn tìm trong chuỗi khác và expressionToSearch là chuỗi khác. start_location tùy chọn có thể được sử dụng để chỉ định một vị trí trong expressionToSearch để bắt đầu tìm kiếm.
Lưu ý rằng chỉ vị trí của lần xuất hiện đầu tiên được trả về.
Ví dụ
Đây là một ví dụ:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.');
Kết quả:
1
Trong ví dụ này, đối số đầu tiên là Bob
, có nghĩa là chúng tôi đang tìm kiếm đối số thứ hai cho Bob
. Kết quả là 1 vì đó là vị trí mà Bob
xuất hiện đầu tiên trong đối số thứ hai.
Bạn cũng có thể nhận thấy rằng Bob
thực sự xuất hiện hai lần trong chuỗi, nhưng chỉ vị trí của kết quả khớp đầu tiên được trả về.
Không phù hợp
Nếu đối số thứ hai không chứa Bob
kết quả sẽ là 0
.
SELECT CHARINDEX('Kate', 'Bob likes beer. Bob also likes beef.');
Kết quả:
0
Chỉ định vị trí bắt đầu
Bạn có thể chỉ định vị trí bắt đầu cho nơi bắt đầu tìm kiếm. Điều này có nghĩa là SQL Server sẽ bỏ qua bất kỳ sự kiện nào xảy ra trước vị trí bắt đầu đó. Tuy nhiên, kết quả vẫn được báo cáo dựa trên vị trí của nó trong chuỗi (không phải từ vị trí bắt đầu).
Nếu điều này nghe có vẻ khó hiểu, ví dụ sau sẽ hữu ích:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Kết quả:
17
Vì vậy, trong ví dụ này, chúng tôi bắt đầu tìm kiếm ở vị trí 16 (tình cờ là khoảng trống trước Bob
thứ 2 ). Kết quả là lần xuất hiện đầu tiên của Bob
bị bỏ qua và vị trí của vị trí thứ hai được trả lại. Và chúng ta có thể thấy rằng vị trí của nó là 17 ký tự kể từ đầu chuỗi (mặc dù nó chỉ là một ký tự từ nơi chúng tôi bắt đầu tìm kiếm).
Phân biệt chữ hoa chữ thường
Bạn có thể thực hiện tìm kiếm phân biệt chữ hoa chữ thường một cách rõ ràng bằng cách thêm mệnh đề COLLATE vào câu lệnh SELECT của mình:
Phân biệt chữ hoa chữ thường
Đây là một tìm kiếm phân biệt chữ hoa chữ thường:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CS_AS);
Kết quả:
0
Điều này phân biệt chữ hoa chữ thường vì _CS
là viết tắt của Phân biệt chữ hoa chữ thường.
Phân biệt chữ hoa chữ thường
Và đây là một tìm kiếm không phân biệt chữ hoa chữ thường:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CI_AS);
Kết quả:
11
Đây là phân biệt chữ hoa chữ thường vì _CI
viết tắt của cụm từ Phân biệt chữ hoa chữ thường.
Hàm PATINDEX ()
PATINDEX()
hàm thực hiện một công việc tương tự với CHARINDEX()
. Về cơ bản, bạn có thể lựa chọn sử dụng cái nào. Sự khác biệt chính là ở cú pháp.
PATINDEX()
cú pháp của hàm như sau:
PATINDEX ( '%pattern%' , expression )
Ở đâu mẫu là một biểu thức ký tự chứa trình tự được tìm thấy và biểu thức là biểu thức được tìm kiếm (thường là một cột).
PATINDEX()
chấp nhận các ký tự đại diện, nhưng không chấp nhận vị trí bắt đầu. CHARINDEX()
mặt khác, chấp nhận một vị trí bắt đầu, nhưng không chấp nhận các ký tự đại diện.
Ví dụ
Đây là một ví dụ:
SELECT PATINDEX('%eer%', 'Bob likes beer.');
Kết quả:
12
Tuy nhiên, đây là điều sẽ xảy ra khi chúng tôi không bao gồm các ký tự đại diện:
SELECT PATINDEX('eer', 'Bob likes beer.');
Kết quả:
0
Dưới đây là một ví dụ khác mà chúng tôi giới thiệu một ký tự đại diện khác:
SELECT PATINDEX('%b_er%', 'Bob likes beer.');
Kết quả:
11
Trong trường hợp này, dấu gạch dưới (_
) là một ký tự đại diện cho bất kỳ ký tự đơn nào.