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


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

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 .


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


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


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


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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.