Warum gibt meine Abfrage mit LIKE '% \ _' alle Zeilen zurück und nicht nur die Zeilen, die mit einem Unterstrich enden?

8

Ich habe derzeit die Abfrage auf Postgres laufen:

%Vor%

Aber anstatt nur Einträge zurückzugeben, die mit einem Unterstrich enden, bekomme ich alle Ergebnisse zurück, unabhängig davon, ob sie einen Unterstrich enthalten oder nicht.

Wenn Sie die folgende Abfrage ausführen, erhalten Sie einen Benutzernamen zurück, der nur ein Unterstrich ist. Das Entkommen funktioniert also:

%Vor%

Wenn Sie die folgende Abfrage ausführen, wird ein Benutzername zurückgegeben, der mit einem bestimmten Buchstaben endet:

%Vor%

Was mache ich falsch?

    
Hates_ 27.01.2009, 11:11
quelle

4 Antworten

16

Erreicht Ihr Backslash nicht PostgreSQL? Wenn Sie die Zeichenfolge durch eine andere Ebene weiterleiten, die den umgekehrten Schrägstrich als Escapezeichen behandelt (z. B. eine Java-Zeichenfolge), entfernt diese Ebene möglicherweise den umgekehrten Schrägstrich und Sie müssen möglicherweise Ihren Backslash für diese Ebene entfernen.

Haben Sie noch weitere Benutzernamen? Wenn der Backslash nicht zu PostgreSQL durchgereicht wird, würde auch '_'

übereinstimmen

Sie können möglicherweise die ESCAPE-Klausel ausprobieren: username LIKE '%!_' ESCAPE '!'

    
Stephen Denne 27.01.2009, 11:28
quelle
5

"_" ist der Platzhalter für ein einzelnes Zeichen in den meisten SQL-Varianten. Sie müssen entkommen, wenn Sie einen tatsächlichen "_" -Charakter erreichen möchten.

    
Cade Roux 27.01.2009 14:41
quelle
2

Es ist eine Weile her, seit ich Postgres benutzt habe, aber ich denke, Sie können '% [_]' machen, um zu bekommen, was Sie wollen. Das funktioniert sicherlich auf dem SQL-Server, obwohl ich gerade kein postgres-Datenbank-Setup eingerichtet habe, um es auf

zu testen     
Matthew Wright 27.01.2009 11:46
quelle
2

Sie müssen den umgekehrten Schrägstrich Ihrer Abfrage durch einen doppelten ersetzen:

SELECT * FROM addenda.users WHERE users.username LIKE '%\_'

Sie können immer noch eine nicht standardmäßige Verwendung von \\ in einer String-Literal Warnung erhalten, aber die Abfrage wird ausgeführt.
Getestet in Postgres 8.4.

    
sigma 17.06.2014 10:12
quelle

Tags und Links