Warum liefert mir die Verwendung eines Unterstrichs in einem LIKE-Filter alle Ergebnisse?

118

Ich habe die folgende SQL-Abfrage mit einer LIKEBedingung geschrieben:

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

In den LIKEmöchte ich für alle Unterstrichen suchen %_%, aber ich weiß , dass meine Spalten Daten keine Streichungszeichen hat.

  • Warum gibt mir die Abfrage alle Datensätze aus der Tabelle?

Beispieldaten:

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

UNSTERBLICH
quelle
1
Es ist schön, eine SQL-Fiddle-Abfrage hinzuzufügen, aber Sie sollten die Abfrage auf SO immer als einfachen Text anzeigen. Andernfalls ist diese Frage anfällig für Link Rot .
Tim Schmelter
_ :: Ein Ersatz für ein einzelnes Zeichen
vhadalgi
Mögliches Duplikat von SQL Server 2000/5 Escape an Underscore
bläulich

Antworten:

192

Ändern Sie Ihren WHEREZustand wie folgt :

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

Dies ist eine der Möglichkeiten, mit denen Oracle Escape-Zeichen unterstützt. Hier definieren Sie das Escape-Zeichen mit dem escapeSchlüsselwort. Weitere Informationen finden Sie unter diesem Link in Oracle Docs .

Die '_'und '%'sind Platzhalter in einer LIKEoperierten Anweisung in SQL.

Der _Charakter sucht nach einer Präsenz von (einem) einzelnen Charakter. Wenn Sie mit dem suchen columnName LIKE '_abc', wird es Sie führen gibt mit den Zeilen mit 'aabc', 'xabc', '1abc', '#abc'aber nicht 'abc', 'abcc', 'xabcd'und so weiter.

Das '%'Zeichen wird verwendet, um 0 oder mehr Zeichen zuzuordnen. Das heißt, wenn Sie suchen columnName LIKE '%abc', wird es Ihnen mit, die zur Folge haben 'abc', 'aabc', 'xyzabc'und so weiter, aber nicht 'xyzabcd', 'xabcdd'und andere Zeichenfolge , die mit nicht zu Ende 'abc'.

In Ihrem Fall haben Sie gesucht '%_%'. Dadurch werden alle Zeilen mit dieser Spalte mit einem oder mehreren Zeichen, dh beliebigen Zeichen, als Wert angegeben. Aus diesem Grund erhalten Sie alle Zeilen, obwohl _Ihre Spaltenwerte keine enthalten .

Rachcha
quelle
Ich habe das gleiche Problem bei Access Db. kann mir bitte sagen, wie ich dieses Problem lösen kann.
Vielleicht können Sie bei Google nach "Platzhaltern in Access DB" suchen. Ich habe nie an Access gearbeitet, daher kann ich Ihnen dabei nicht helfen. Ich bezweifle sogar, dass Access den likeBetreiber unterstützt . Meine Lösung funktioniert in den meisten, wenn nicht allen Datenbanken.
Rachcha
2
Was hier nicht angegeben ist, ist, dass dies auch auf SQL Server funktioniert - was mich zunächst darüber beunruhigt hat, warum das OP eine Antwort für Oracle SQL akzeptiert hat, als sie selbst die Frage für SQL Server markiert haben. Zumindest sollte die Antwort so geschrieben werden, dass sie hauptsächlich auf das ursprünglich getaggte DBMS abzielt.
underscore_d
86

Der Unterstrich ist der Platzhalter in einerLIKE Abfrage für ein beliebiges Zeichen.

Bedeutet daher LIKE %_%"gib mir alle Datensätze mit mindestens einem beliebigen Zeichen in dieser Spalte".

Sie müssen das Platzhalterzeichen in SQL-Server mit []etwa umgehen :

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

Siehe: LIKE (Transact-SQL)

Demo

Tim Schmelter
quelle
Vielen Dank, dass Sie den MSDN-Link in Ihrer Antwort angegeben haben. Es fiel mir schwer, Informationen über Unterstriche zu finden, bis ich Ihren Beitrag gelesen habe.
Chris Smith
5
Dies ist die richtige Antwort, da der Benutzer das sql-serverTag in seiner Frage angegeben hat und die bereitgestellte SQLFiddle auch als MS SQL Server 2008 bezeichnet wird.
Govind Rai
8

Wenn Sie gezielt nach einem Platzhalterzeichen suchen möchten, müssen Sie dem entkommen

Dies erfolgt durch Hinzufügen der ESCAPEKlausel zu Ihrem LIKEAusdruck. Das mit der ESCAPEKlausel angegebene Zeichen macht das folgende Platzhalterzeichen "ungültig".

Sie können ein beliebiges Zeichen verwenden (nur kein Platzhalterzeichen). Die meisten Leute benutzen a, \weil das auch viele Programmiersprachen benutzen

Ihre Anfrage würde also ergeben:

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

Sie können aber auch jeden anderen Charakter verwenden:

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

Hier ist ein SQLFiddle-Beispiel: http://sqlfiddle.com/#!6/63e88/4

ein Pferd ohne Name
quelle
5

Unterstrich ist ein Platzhalter für etwas. Zum Beispiel sucht 'A_%' nach allen Übereinstimmungen, die mit 'A' beginnen und danach mindestens 1 zusätzliches Zeichen haben

Franck
quelle
0

Sie können die Abfrage wie folgt schreiben:

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

es wird dein Problem lösen.

Sonali Lad
quelle
Wie fügt dies etwas hinzu, das über die akzeptierte Antwort hinausgeht?
Noah Broyles
0

Falls Leute suchen, wie es in BigQuery geht:

  • Ein Unterstrich "_" entspricht einem einzelnen Zeichen oder Byte.

  • Sie können "\", "_" oder "%" mit zwei Backslashes maskieren. Zum Beispiel, "\%". Wenn Sie rohe Zeichenfolgen verwenden, ist nur ein einziger Backslash erforderlich. Zum Beispiel r "\%".

WHERE mycolumn LIKE '%\\_%'

Quelle: https://cloud.google.com/bigquery/docs/reference/standard-sql/operators

p1nox
quelle