2012-05-29 65 views
26

Tôi có truy vấn SQL như dưới đây.Truy vấn 'LIKE' của SQL sử dụng '%' trong đó tiêu chí tìm kiếm chứa '%'

Select * from table 
where name like '%' + search_criteria + '%' 

Nếu search_criteria = 'abc', nó sẽ trả về dữ liệu có chứa xxxabcxxxx.

Nhưng nếu search_criteria = 'abc%' của tôi, nó vẫn sẽ trả lại dữ liệu có chứa xxxabcxxx, không phải như vậy.

Làm cách nào để xử lý tình huống này?

+1

thì tại sao thêm% của riêng bạn? – Randy

+0

bạn đang sử dụng ngôn ngữ lập trình nào? – Jeshurun

+0

ngôn ngữ lập trình = C# – pratik

Trả lời

22

MS-SQL; Nếu bạn muốn có một biểu tượng %search_criteria để được coi là ký tự chữ chứ không phải là ký tự đại diện, hãy thoát nó thành [%];

.... where name like '%' + replace(search_criteria, '%', '[%]') + '%' 
+1

cảm ơn bạn, cung cấp cho cột với dấu% 'select * từ tablename trong đó Cột như '% [%]%'' – stom

+0

câu trả lời tuyệt vời .... Cảm ơn. – User

2
Select * from table where name like search_criteria 

nếu bạn đang mong đợi người dùng để thêm các kí hiệu riêng của họ ...

0

Thoát khỏi ký hiệu phần trăm \% để làm cho nó một phần của giá trị so sánh của bạn.

+0

Điều này chỉ hoạt động nếu bạn sử dụng tùy chọn 'ESCAPE' của toán tử' LIKE'. Không có ký tự thoát mặc định (trong SQL Server, anyway). –

2

Bạn cần phải thoát khỏi nó: trên nhiều cơ sở dữ liệu này được thực hiện bằng cách trước nó với dấu gạch chéo ngược, \%.

Vì vậy, abc trở thành abc\%.

Ngôn ngữ lập trình của bạn sẽ có chức năng cụ thể cho cơ sở dữ liệu để thực hiện việc này cho bạn. Ví dụ: PHP có mysql_escape_string() cho cơ sở dữ liệu MySQL.

7

Sử dụng một khoản thoát:

select * 
    from (select '123abc456' AS result from dual 
     union all 
     select '123abc%456' AS result from dual 
     ) 
    WHERE result LIKE '%abc\%%' escape '\' 

quả

123abc%456 

Bạn có thể thiết lập ký tự thoát của bạn để bất cứ điều gì bạn muốn. Trong trường hợp này, mặc định '\'. Dấu thoát '\%' trở thành chữ cái, chữ '%' thứ hai không được thoát, vì vậy thẻ hoang dã một lần nữa.

Xem List of special characters for SQL LIKE clause

10

Giải pháp đơn giản nhất là để phân chia với "like" hoàn toàn:

Select * 
from table 
where charindex(search_criteria, name) > 0 

Tôi thích CHARINDEX qua như thế nào. Về mặt lịch sử, nó có hiệu suất tốt hơn, nhưng tôi không chắc liệu nó có tạo ra nhiều sự khác biệt bây giờ hay không.

+0

Tôi thực sự thích câu trả lời này, vì nó rõ ràng không dễ bị tấn công bởi SQL Injection, vì bạn đã tránh chuỗi nối. – StuartQ

+0

kiểm tra [sql-server-performance] (http://www.sql-server-performance.com/forum/threads/charindex-vs-like.16120/) để so sánh v ngắn. Lưu ý rằng việc sử dụng 'like 'findme%'' vẫn có thể sử dụng một chỉ mục nếu nó tồn tại. –

0

Có thể đây là một sự giúp đỡ :)

DECLARE @SearchCriteria VARCHAR(25) 
SET @SearchCriteria = 'employee' 
IF CHARINDEX('%', @SearchCriteria) = 0 
BEGIN 
SET @SearchCriteria = '%' + @SearchCriteria + '%' 
END 
SELECT * 
FROM Employee 
WHERE Name LIKE @SearchCriteria 
4

Để thoát khỏi một nhân vật trong sql bạn có thể sử dụng !:


VÍ DỤ - sử dụng các ký ESCAPE

Điều quan trọng là để hiểu cách "Escape Characters" khi khớp mẫu. Những ví dụ này đối phó đặc biệt với các ký tự thoát trong Oracle.

Giả sử bạn muốn tìm kiếm ký tự% hoặc _ trong điều kiện LIKE SQL. Bạn có thể làm điều này bằng cách sử dụng ký tự Escape.

Xin lưu ý rằng bạn chỉ có thể xác định ký tự thoát là một ký tự đơn (độ dài 1).

Ví dụ:

SELECT * 
FROM suppliers 
WHERE supplier_name LIKE '!%' escape '!'; 

SQL này NHƯ điều kiện ví dụ xác định! nhân vật như một nhân vật thoát. Tuyên bố này sẽ trả về tất cả các nhà cung cấp có tên là%.

Dưới đây là một ví dụ phức tạp hơn bằng cách sử dụng ký tự thoát trong điều kiện LIKE SQL.

SELECT * 
FROM suppliers 
WHERE supplier_name LIKE 'H%!%' escape '!'; 

Ví dụ về điều kiện LIKE này trả về tất cả các nhà cung cấp có tên bắt đầu bằng chữ H và kết thúc bằng%. Ví dụ, nó sẽ trả về một giá trị như 'Hello%'.

Bạn cũng có thể sử dụng ký tự thoát với ký tự _ trong điều kiện LIKE SQL.

Ví dụ:

SELECT * 
FROM suppliers 
WHERE supplier_name LIKE 'H%!_' escape '!'; 

SQL này NHƯ tình trạng dụ trả về tất cả các nhà cung cấp có tên bắt đầu bằng chữ cái H và kết thúc vào _. Ví dụ, nó sẽ trả về một giá trị như 'Hello_'.


tham khảo: sql/like

Các vấn đề liên quan