Dlaczego użycie znaku podkreślenia w filtrze LIKE daje mi wszystkie wyniki?


118

Napisałem poniższe zapytanie SQL z LIKEwarunkiem:

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

W polu LIKEChcę wyszukać podkreślenia %_%, ale wiem, że dane moich kolumn nie zawierają znaków podkreślenia.

  • Dlaczego zapytanie dostarcza mi wszystkie rekordy z tabeli?

Przykładowe dane:

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
Fajnie jest dodać zapytanie sql-fiddle, ale zawsze powinieneś pokazywać zapytanie na SO jako zwykły tekst. W przeciwnym razie to pytanie jest podatne na gnicie linków .
Tim Schmelter,

_ :: substytut pojedynczej postaci
vhadalgi

Odpowiedzi:


193

Zmodyfikuj swój WHEREstan w ten sposób:

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

Jest to jeden ze sposobów, w jaki Oracle obsługuje znaki ucieczki. Tutaj definiujesz znak ucieczki za pomocą escapesłowa kluczowego. Aby uzyskać szczegółowe informacje, zobacz ten link w Oracle Docs .

Znaki '_'i '%'są znakami wieloznacznymi w LIKEinstrukcji operowanej w języku SQL.

_Postać wygląda na obecności (dowolnym) jednego znaku. Jeśli szukać według columnName LIKE '_abc', da Ci prowadzić z wierszy konieczności 'aabc', 'xabc', '1abc', '#abc'ale NIE 'abc', 'abcc', 'xabcd'i tak dalej.

'%'Znak jest używany do dopasowania 0 lub więcej liczbę znaków. Oznacza to, że jeśli szukać według columnName LIKE '%abc', da Ci prowadzić z konieczności 'abc', 'aabc', 'xyzabc'i tak dalej, ale nie 'xyzabcd', 'xabcdd'i każdy inny ciąg, który nie kończy się 'abc'.

W twoim przypadku szukałeś przez '%_%'. Dzięki temu wszystkie wiersze z tą kolumną będą miały jeden lub więcej znaków, czyli dowolne znaki, jako wartość. Dlatego otrzymujesz wszystkie wiersze, mimo że nie ma ich _w wartościach kolumn.


Mam ten sam problem w dostępie Db. proszę, powiedz mi, jak mogę rozwiązać ten problem.

Być może możesz wyszukać w Google „symbole wieloznaczne w bazie danych dostępu”. Nigdy nie pracowałem nad Accessem, więc nie mogę Ci w tym pomóc. Wątpię nawet, czy Access obsługuje likeoperatora. Moje rozwiązanie będzie działać w większości, jeśli nie we wszystkich, bazach danych.
Rachcha,

2
Nie stwierdzono tutaj, że działa to również na SQL Server - co początkowo wprawiło mnie w zakłopotanie, dlaczego OP zaakceptował odpowiedź na Oracle SQL, kiedy sami oznaczyli pytanie dla SQL Server. Przynajmniej odpowiedź powinna być napisana tak, aby była przede wszystkim ukierunkowana na pierwotnie oznaczony DBMS.
underscore_d

87

Podkreślenie to symbol wieloznaczny wLIKE zapytaniu dotyczącym jednego dowolnego znaku.

Stąd LIKE %_%oznacza „podaj mi wszystkie rekordy z co najmniej jednym dowolnym znakiem w tej kolumnie”.

Musisz uciec od symbolu wieloznacznego, w sql-server z []około:

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

Zobacz: LIKE (Transact-SQL)

Demo


Dziękujemy za podanie łącza MSDN w odpowiedzi. Trudno mi było znaleźć informacje o podkreśleniu znaku specjalnego, dopóki nie przeczytałem twojego postu.
Chris Smith

5
To jest poprawna odpowiedź jako użytkownik określony sql-servertag w swoim pytaniu, a ich warunkiem SQLFiddle jest również oznaczona jako MS SQL Server 2008.
Govind Rai

8

Ponieważ chcesz konkretnie wyszukać znak wieloznaczny, musisz tego uniknąć

Odbywa się to poprzez dodanie ESCAPEklauzuli do LIKEwyrażenia. Znak określony w ESCAPEklauzuli „unieważni” następujący znak wieloznaczny.

Możesz użyć dowolnego znaku (ale nie znaku wieloznacznego). Większość ludzi używa \znaku, ponieważ tego używa również wiele języków programowania

Twoje zapytanie spowodowałoby:

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

Ale równie dobrze możesz użyć dowolnej innej postaci:

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

Oto przykład SQLFiddle: http://sqlfiddle.com/#!6/63e88/4


5

Podkreślenie to symbol wieloznaczny. na przykład „A_%” będzie szukać wszystkich dopasowań rozpoczynających się od „A” i będzie zawierać co najmniej 1 dodatkowy znak po tym


0

Możesz napisać zapytanie jak poniżej:

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

to rozwiąże twój problem.


Jak to dodaje coś poza zaakceptowaną odpowiedzią?
Noah Broyles

0

Jeśli ludzie szukają informacji, jak to zrobić w BigQuery:

  • Podkreślenie „_” oznacza pojedynczy znak lub bajt.

  • Możesz zmienić znaczenie znaków „\”, „_” lub „%” za pomocą dwóch odwrotnych ukośników. Na przykład, "\%". Jeśli używasz nieprzetworzonych ciągów, wymagany jest tylko jeden lewy ukośnik. Na przykład r "\%".

WHERE mycolumn LIKE '%\\_%'

Źródło: https://cloud.google.com/bigquery/docs/reference/standard-sql/operators

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.