Tại sao việc sử dụng ký tự Dấu gạch dưới trong bộ lọc LIKE lại cho tôi tất cả kết quả?


118

Tôi đã viết truy vấn SQL bên dưới với một LIKEđiều kiện:

SELECT * FROM Manager
WHERE managerid LIKE '_%'
AND managername LIKE '%_%'

Trong hộp, LIKEtôi muốn tìm kiếm bất kỳ dấu gạch dưới nào %_%, nhưng tôi biết rằng dữ liệu của các cột của tôi không có ký tự gạch dưới.

  • Tại sao truy vấn cung cấp cho tôi tất cả các bản ghi từ bảng?

Dữ liệu mẫu:

create table Manager(
    id int
    ,managerid varchar(3)
    ,managername varchar(50)
    );

insert into Manager(id,managerid,managername)values(1,'A1','Mangesh');
insert into Manager(id,managerid,managername)values(2,'A2','Sagar');
insert into Manager(id,managerid,managername)values(3,'C3','Ahmad');
insert into Manager(id,managerid,managername)values(4,'A4','Mango');
insert into Manager(id,managerid,managername)values(5,'B5','Sandesh');

Sql-Fiddle


1
Thật tuyệt khi thêm truy vấn sql-fiddle, nhưng bạn phải luôn hiển thị truy vấn trên SO dưới dạng văn bản thuần túy. Nếu không câu hỏi này rất dễ bị thối liên kết .
Tim Schmelter

_ :: Một thay thế cho một ký tự đơn
vhadalgi

Câu trả lời:


193

Sửa đổi WHEREđiều kiện của bạn như thế này:

WHERE mycolumn LIKE '%\_%' ESCAPE '\'

Đây là một trong những cách mà Oracle hỗ trợ các ký tự thoát. Ở đây bạn xác định ký tự thoát với escapetừ khóa. Để biết chi tiết, hãy xem liên kết này trên Oracle Docs .

Các '_''%'là ký tự đại diện trong một LIKEtuyên bố hoạt động trong SQL.

_tự tìm kiếm sự hiện diện của (bất kỳ) một ký tự. Nếu bạn tìm kiếm theo columnName LIKE '_abc', nó sẽ cung cấp cho bạn kết quả với hàng có 'aabc', 'xabc', '1abc', '#abc'nhưng KHÔNG 'abc', 'abcc', 'xabcd'và vân vân.

'%'tự được sử dụng để khớp với số lượng ký tự 0 hoặc nhiều hơn. Điều đó có nghĩa, nếu bạn tìm kiếm theo columnName LIKE '%abc', nó sẽ cung cấp cho bạn kết quả với có 'abc', 'aabc', 'xyzabc'và như vậy, nhưng không có 'xyzabcd', 'xabcdd'và bất kỳ chuỗi khác mà không kết thúc với 'abc'.

Trong trường hợp của bạn, bạn đã tìm kiếm bằng '%_%'. Điều này sẽ cung cấp cho tất cả các hàng có cột đó có một hoặc nhiều ký tự, có nghĩa là bất kỳ ký tự nào, làm giá trị của nó. Đây là lý do tại sao bạn nhận được tất cả các hàng mặc dù không có _giá trị cột của bạn.


Tôi phải đối mặt với cùng một vấn đề trong việc truy cập Db. xin vui lòng cho tôi biết làm thế nào tôi có thể giải quyết vấn đề này.

Có lẽ bạn có thể Google cho 'ký tự đại diện trong truy cập db'. Tôi chưa bao giờ làm việc trên Access, vì vậy tôi không thể giúp bạn điều đó. Tôi thậm chí còn nghi ngờ nếu Access hỗ trợ likenhà điều hành. Giải pháp của tôi sẽ hoạt động trong hầu hết, nếu không phải tất cả, cơ sở dữ liệu.
Rachcha

2
Điều không được nêu ở đây là điều này cũng hoạt động trên SQL Server - điều này ban đầu khiến tôi băn khoăn tại sao OP chấp nhận câu trả lời cho Oracle SQL, khi chính họ gắn thẻ câu hỏi cho SQL Server. Ít nhất câu trả lời phải được viết để chủ yếu nhắm mục tiêu DBMS được gắn thẻ ban đầu.
underscore_d

87

Dấu gạch dưới là ký tự đại diện trongLIKE truy vấn cho một ký tự tùy ý.

Do đó LIKE %_%có nghĩa là "cung cấp cho tôi tất cả các bản ghi có ít nhất một ký tự tùy ý trong cột này".

Bạn phải thoát ký tự đại diện, trong máy chủ sql với []xung quanh:

SELECT m.* 
FROM Manager m 
WHERE m.managerid    LIKE  '[_]%'
AND   m.managername  LIKE '%[_]%'

Xem: LIKE (Transact-SQL)

Demo


Cảm ơn bạn đã cung cấp liên kết MSDN trong câu trả lời của bạn. Tôi đã gặp khó khăn trong việc tìm kiếm thông tin về ký tự đặc biệt gạch dưới cho đến khi tôi đọc bài đăng của bạn.
Chris Smith

5
Đây là câu trả lời đúng như người sử dụng xác định các sql-servertừ khóa trong câu hỏi của họ và SQLFiddle cung cấp của họ cũng được chỉ định là MS SQL Server 2008.
Govind Rai

8

Khi bạn muốn tìm kiếm cụ thể một ký tự đại diện, bạn cần phải thoát khỏi điều đó

Điều này được thực hiện bằng cách thêm ESCAPEmệnh đề vào LIKEbiểu thức của bạn . Ký tự được chỉ định với ESCAPEmệnh đề sẽ "làm mất hiệu lực" ký tự đại diện sau.

Bạn có thể sử dụng bất kỳ ký tự nào bạn thích (không phải ký tự đại diện). Hầu hết mọi người sử dụng a \bởi vì đó là ngôn ngữ lập trình mà nhiều ngôn ngữ lập trình cũng sử dụng

Vì vậy, truy vấn của bạn sẽ dẫn đến:

select * 
from Manager
where managerid LIKE '\_%' escape '\'
and managername like '%\_%' escape '\';

Nhưng bạn cũng có thể sử dụng bất kỳ ký tự nào khác:

select * 
from Manager
where managerid LIKE '#_%' escape '#'
and managername like '%#_%' escape '#';

Đây là một ví dụ SQLFiddle: http://sqlfiddle.com/#!6/63e88/4


5

Dấu gạch dưới là một ký tự đại diện cho một cái gì đó. ví dụ: 'A_%' sẽ tìm kiếm tất cả các kết quả phù hợp Bắt đầu từ 'A' và có thêm tối thiểu 1 ký tự sau đó


0

Bạn có thể viết câu truy vấn như sau:

SELECT * FROM Manager
WHERE managerid LIKE '\_%' escape '\'
AND managername LIKE '%\_%' escape '\';

nó sẽ giải quyết vấn đề của bạn.


Làm thế nào để điều này thêm bất cứ điều gì ngoài câu trả lời được chấp nhận?
Noah Broyles

0

Trong trường hợp mọi người đang tìm kiếm cách thực hiện trong BigQuery:

  • Dấu gạch dưới "_" khớp với một ký tự hoặc byte.

  • Bạn có thể thoát "\", "_" hoặc "%" bằng hai dấu gạch chéo ngược. Ví dụ, "\%". Nếu bạn đang sử dụng chuỗi thô, chỉ cần một dấu gạch chéo ngược duy nhất. Ví dụ: r "\%".

WHERE mycolumn LIKE '%\\_%'

Nguồn: https://cloud.google.com/bigquery/docs/reference/standard-sql/operators

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.