lập trình là một lĩnh vực hot trong thời đại công nghệ phát triển mạnh mẽ, và việc tìm kiếm những lập trình viên giỏi càng trở nên cần thiết hơn bao giờ hết. Vì vậy, từ những năm đầu tiên của học đội chúng ta đã được tiếp cận với môn lập trình.
Làm quen với lập trình không phải dễ dàng, nhưng nếu bạn nghiêm túc theo đuổi nó, thì không có gì là không thể. Hiện nay, có rất nhiều cách để học lập trình, từ việc tham gia các khóa học trực tiếp, học trực tuyến cho đến tự học tại nhà.
Lập trình bao gồm nhiều ngôn ngữ và cách quản lý cơ sở dữ liệu khác nhau. Nếu bạn quyết định học lập trình, tất nhiên bạn phải nắm vững việc sử dụng SQL Server. Theo cách cơ bản, SQL Server bao gồm các câu lệnh và điều kiện. Trong bài viết này, chúng ta cùng tìm hiểu về hàm "LIKE" trong SQL Server.
Cú pháp của điều kiện LIKE
"biểu thức" LIKE "mẫu" [ESCAPE 'Escape_Character']
Tên biến hoặc giá trị biến
Biểu thức
Biểu thức là ký tự như cột hoặc trường thông tin.
Mẫu
Mẫu là biểu thức ký tự mà chúng ta muốn so sánh với. Mẫu có thể chứa các ký tự thông thường và ký tự đại diện. Toán tử LIKE được sử dụng trong mệnh đề WHERE của câu lệnh SELECT, UPDATE và DELETE để lọc các hàng dựa trên cách khớp mẫu.
Điều kiện LIKE trong SQL Server (Transact-SQL) cho phép sử dụng ký tự đại diện (wildcard) trong mệnh đề WHERE của các câu lệnh SELECT, INSERT, UPDATE và DELETE, nhằm so sánh mẫu.
Ký tự đại diện trong LIKE
%
: tìm các chuỗi ký tự với bất kỳ độ dài nào (bao gồm cả độ dài 0)._
: tìm một ký tự.[^]
: tìm bất kỳ ký tự nào không chứa trong dấu[^]
.
Ký tự bỏ qua (Escape Character)
Ký tự bỏ qua là tùy chọn và cho phép kiểm tra xem ký tự đại diện như %
hay _
có được sử dụng theo nghĩa đen (dưới dạng hằng số), chứ không được sử dụng như một ký tự đặc biệt.
Ví dụ về sử dụng ký tự đại diện %
Dùng ký tự đại diện %
trong điều kiện LIKE của SQL Server để tìm những nhân viên có họ bắt đầu bằng chữ cái "B".
SELECT * FROM nhanvien WHERE ho LIKE 'B%';
Cũng có thể sử dụng nhiều lần ký tự %
trong cùng một chuỗi như ví dụ dưới đây.
SELECT * FROM nhanvien WHERE ho LIKE '%0%';
Kết quả trả về các nhân viên mà trong họ có chứa chữ cái 'o'.
Ví dụ về sử dụng ký tự đại diện _
Lưu ý rằng ký tự _
chỉ dùng để tìm kiếm một ký tự (độ dài bằng 1).
SELECT * FROM nhanvien WHERE ho LIKE 'Ad_m';
Trong ví dụ này, kết quả trả về là các nhân viên có tên gồm 4 chữ cái, trong đó 2 chữ cái đầu là "Ad" và chữ cái cuối là "m". Ví dụ như Adam, Adem, Adim, Adom...
Dưới đây là một ví dụ khác:
SELECT * FROM nhanvien WHERE so_nhanvien LIKE '123_';
Bạn đang tìm số nhân viên mà chỉ có 3 trong 4 chữ số. Trong ví dụ trên, kết quả trả về gồm 10 bản ghi, các giá trị thiếu nằm từ 0 tới 9: 1230, 1231, 1232...
Ví dụ về sử dụng ký tự đại diện []
Lưu ý rằng những gì nằm trong dấu ngoặc vuông là các ký tự mà bạn muốn và khớp với mẫu.
SELECT * FROM nhanvien WHERE ten LIKE 'Sm[iy]th';
Kết quả trả về trong ví dụ này là các nhân viên mà tên có 5 chữ cái, trong đó 2 chữ cái đầu là "Sm" và 2 chữ cái cuối là "th", chữ cái ở giữa có thể là "i" hoặc "y". Vậy kết quả có thể là Smith hoặc Smyth.
SELECT * FROM nhanvien WHERE ten LIKE 'Smy[^iy]th';
Những gì nằm trong dấu ngoặc vuông là những ký tự bạn không muốn khớp với mẫu. Kết quả là tên nhân viên có 5 chữ cái, trong đó 2 chữ đầu là "Sm", 2 chữ cuối là "th" và chữ ở giữa không phải "i" cũng không phải "y". Kết quả có thể là Smath, Smeth...
Ví dụ về sử dụng toán tử NOT
Đây là cách sử dụng toán tử NOT trong SQL Server với các ký tự đại diện. Bạn có thể tìm họ nhân viên không bắt đầu bằng chữ cái "B" bằng điều kiện LIKE.
SELECT * FROM nhanvien WHERE ho NOT LIKE 'B%';
Bằng cách đặt toán tử NOT trước điều kiện LIKE, bạn tìm được họ nhân viên không bắt đầu bằng "B".
Ví dụ về sử dụng ký tự bỏ qua Escape Character
Việc sử dụng ký tự bỏ qua rất quan trọng khi so sánh mẫu, để tránh việc hiểu nhầm các ký tự đặc biệt khi ta muốn sử dụng chúng như một giá trị hằng.
Ví dụ như bạn muốn tìm các ký tự a%
hay a_
, chẳng hạn.
Lưu ý rằng chỉ có thể định nghĩa ký tự bỏ qua bằng 1 ký tự (độ dài bằng 1).
SELECT * FROM nhanvien WHERE secret_hint LIKE '123!%455' ESCAPE '!';
Lệnh này sẽ trả về các nhân viên có secret_hint
là 123%455. Ký tự %
không còn được dùng với ý nghĩa trước đó mà như một ký tự bình thường.
Đây là một ví dụ phức tạp hơn.
SELECT * FROM nhanvien WHERE secret_hint LIKE 'H%!%' ESCAPE '!';
Kết quả trả về của điều kiện LIKE là các nhân viên có secret_hint
bắt đầu bằng "H" và kết thúc bằng "%", ví dụ như "Help%".
Cũng có thể sử dụng ký tự bỏ qua với cả ký tự _
trong điều kiện LIKE.
SELECT * FROM nhanvien WHERE secret_hint LIKE 'H%!_' ESCAPE '!';
Ví dụ này trả về các nhân viên có secret_hint
bắt đầu bằng "H" và kết thúc bằng "", ví dụ như "Help".
Ví dụ về toán tử NOT LIKE trong SQL Server
Ví dụ sau sử dụng toán tử NOT LIKE để tìm khách hàng tại nơi ký tự đầu tiên trong tên gọi không phải là chữ cái "A":
SELECT customer_id, first_name, last_name FROM sales.customers WHERE first_name NOT LIKE 'A%' ORDER BY first_name;
Điều cần ghi nhớ khi sử dụng LIKE trong SQL Server
Khi bạn thực hiện so sánh chuỗi bằng cách sử dụng LIKE, tất cả các ký tự trong chuỗi mẫu đều có ý nghĩa. Những ký tự quan trọng bao gồm mọi khoảng trắng ở đầu hoặc ở cuối. Nếu phép so sánh trong truy vấn trả về tất cả các hàng có chuỗi LIKE 'abc ' (abc theo sau là một khoảng trắng), thì một hàng trong đó với giá trị cột là abc (abc không có khoảng trắng) sẽ không được trả về. Tuy nhiên, các khoảng trống ở cuối, trong biểu thức phù hợp với mẫu, sẽ bị bỏ qua. Nếu phép so sánh trong truy vấn trả về tất cả các hàng có chuỗi LIKE 'abc' (abc không có khoảng trắng), thì tất cả các hàng bắt đầu bằng abc và không có hoặc nhiều khoảng trống ở cuối sẽ được trả về.
Một so sánh chuỗi sử dụng mẫu chứa dữ liệu char và varchar có thể không vượt qua so sánh LIKE do cách lưu trữ dữ liệu cho từng loại dữ liệu. Ví dụ khi chuyển một biến char cục bộ sang một thủ tục được lưu trữ, sau đó sử dụng khớp mẫu để tìm tất cả nhân viên có tên họ bắt đầu bằng bộ ký tự đã chỉ định.
Code ví dụ:
-- Sử dụng AdventureWorks CREATE PROCEDURE FindEmployee @EmpLName CHAR(20) AS SELECT @EmpLName = RTRIM(@EmpLName) + '%'; SELECT p.FirstName, p.LastName, a.City FROM Person.Person p INNER JOIN Person.Address a ON p.BusinessEntityID = a.AddressID WHERE p.LastName LIKE @EmpLName; GO EXEC FindEmployee @EmpLName = 'Barb'; GO
Trong thủ tục FindEmployee, không có hàng nào được trả về vì biến char (@EmpLName) chứa khoảng trống ở cuối mỗi khi tên chứa ít hơn 20 ký tự. Vì cột LastName là varchar nên không có khoảng trống ở cuối. Quy trình này không thành công do khoảng trống ở cuối quan trọng.
Tuy nhiên, ví dụ sau là thành công vì khoảng trống ở dưới không được thêm vào biến varchar:
-- Sử dụng AdventureWorks CREATE PROCEDURE FindEmployee @EmpLName VARCHAR(20) AS SELECT @EmpLName = RTRIM(@EmpLName) + '%'; SELECT p.FirstName, p.LastName, a.City FROM Person.Person p INNER JOIN Person.Address a ON p.BusinessEntityID = a.AddressID WHERE p.LastName LIKE @EmpLName; GO EXEC FindEmployee @EmpLName = 'Barb'; GO
Kết quả:
Bài trước: Điều kiện IS NOT NULL trong SQL Server Bài tiếp: Điều kiện NOT trong SQL Server