Wie kann ich eckige Klammern in einer LIKE-Klausel umgehen?

234

Ich versuche, Elemente mit einer gespeicherten Prozedur mit like zu filtern. Die Spalte ist ein Varchar (15). Die Elemente, die ich filtern möchte, haben eckige Klammern im Namen.

Zum Beispiel : WC[R]S123456.

Wenn ich ein mache LIKE 'WC[R]S123456', wird es nichts zurückgeben.

Ich habe einige Informationen zur Verwendung des ESCAPESchlüsselworts mit gefunden, LIKEaber ich verstehe nicht, wie ich damit die eckigen Klammern als reguläre Zeichenfolge behandeln soll.

Travis
quelle

Antworten:

326
LIKE 'WC[[]R]S123456' 

oder

LIKE 'WC\[R]S123456' ESCAPE '\'

Sollte arbeiten.

Otávio Décio
quelle
10
Das Schlüsselwort ESCAPE ist erforderlich, wenn Sie ein benutzerdefiniertes Escape-Zeichen verwenden möchten (der Backslash ist tatsächlich benutzerdefiniert).
Ryan Kohn
2
Ich habe auch den anderen Teil der Antwort korrigiert. SQL Fiddle mit vor und nach Versionen
Martin Smith
10
Wenn jemand nicht sicher ist, warum die Klammer maskiert werden muss, gibt die Dokumentation für LIKE an, dass sie zum Abgleichen eines einzelnen Zeichens in einem Bereich oder einer Menge verwendet wird. Beispielsweise entspricht die Verwendung LIKE '[fz]oo'sowohl "foo" als auch "zoo".
Ganzheitlicher Entwickler
3
Es wäre schön, in der Antwort eine Begründung für beide zu haben. Mir war nicht sofort klar, warum das erste Beispiel funktionieren würde, bis ich die Antwort von Amitesh unten las.
Don Jewett
1
Bevorzugen Sie es, LIKE 'WC\[R]S123456' ESCAPE '\'da es für die Wartung besser lesbar ist.
Feuer Druide
118

Angenommen, Sie möchten mit dem Literal übereinstimmen its[brac]et.

Sie müssen dem nicht entkommen, ]da es nur dann eine besondere Bedeutung hat, wenn es mit gepaart ist [.

Daher [reicht es aus, zu entkommen , um das Problem zu lösen. Sie können entkommen, [ indem Sie es durch ersetzen [[] .

Amitesh
quelle
7
Dies war wirklich hilfreich und imo die beste Antwort.
Jared Sol
1
[[]sieht zwar komisch aus, ist aber sinnvoll, wenn man es aus der Perspektive des Parsers betrachtet. Der Parser hat eine spezielle Regel für den Umgang mit Zeichen zwischen [ ]. Der Text its[brac]etbedeutet also: "Suchen Sie die folgenden aufeinander folgenden Zeichenfolgen : its, (Regel für eckige Klammern anwenden :) brac, et" . Auf der anderen Seite its[[]brac]etbedeutet: "Finden Sie die folgenden aufeinander folgenden Zeichenfolgen : its, (Regel für eckige Klammern anwenden :) [, brac]et" .
Brian
28

Ich musste Namen, die mit einem Unterstrich begannen, von einer Abfrage ausschließen, daher kam ich zu folgendem Ergebnis:

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character
Andrew Backer
quelle
2
Ich musste diese Version verwenden (wobei das "Escape" -Zeichen explizit angegeben wurde) - die anderen Antworten hier lieferten nicht die richtigen Ergebnisse für mich.
MarcE
20

Folgendes habe ich tatsächlich verwendet:

like 'WC![R]S123456' ESCAPE '!'
Travis
quelle
15

Das Schlüsselwort ESCAPE wird verwendet, wenn Sie nach Sonderzeichen wie% und _ suchen müssen, die normalerweise Platzhalter sind. Wenn Sie ESCAPE angeben, sucht SQL buchstäblich nach den Zeichen% und _.

Hier ist ein guter Artikel mit einigen weiteren Beispielen

SELECT columns FROM table WHERE 
    column LIKE '%[[]SQL Server Driver]%' 

-- or 

SELECT columns FROM table WHERE 
    column LIKE '%\[SQL Server Driver]%' ESCAPE '\'
Scottm
quelle
6

Wenn Sie Sonderzeichen wie '_' (Unterstrich) wie in meinem Fall umgehen müssen und keine ESCAPE-Klausel definieren möchten / können, möchten Sie das Sonderzeichen möglicherweise in eckige Klammern setzen '[ ' und '] ' .

Dies erklärt die Bedeutung der "seltsamen" Zeichenfolge "[[]" - sie umfasst nur das Zeichen "[" mit eckigen Klammern und entgeht ihm effektiv.

Mein Anwendungsfall bestand darin, den Namen einer gespeicherten Prozedur mit Unterstrichen als Filterkriterium für den Profiler anzugeben. Also habe ich den String '% name [_] von [_] einer [_] gespeicherten [_] Prozedur%' eingefügt. in ein TextData LIKE-Feld eingefügt und sie hat mir Trace-Ergebnisse geliefert, die ich erreichen wollte.

Hier ist ein gutes Beispiel aus der Dokumentation: LIKE (Transact-SQL) - Verwenden von Platzhalterzeichen als Literale

ssurba
quelle
4

Laut Dokumentation :

Sie können die mit dem Platzhaltermuster übereinstimmenden Zeichen als Literalzeichen verwenden. Um ein Platzhalterzeichen als Literalzeichen zu verwenden, setzen Sie das Platzhalterzeichen in Klammern.

Sie müssen diesen drei Zeichen entkommen %_[:

'5%'      LIKE '5[%]'      -- true
'5$'      LIKE '5[%]'      -- false
'foo_bar' LIKE 'foo[_]bar' -- true
'foo$bar' LIKE 'foo[_]bar' -- false
'foo[bar' LIKE 'foo[[]bar' -- true
'foo]bar' LIKE 'foo]bar'   -- true
Salman A.
quelle
1

Anstelle von '\' oder einem anderen Zeichen auf der Tastatur können Sie auch Sonderzeichen verwenden, die nicht auf der Tastatur vorhanden sind. Abhängig von Ihrem Anwendungsfall kann dies erforderlich sein, wenn Sie nicht möchten, dass Benutzereingaben versehentlich als Escape-Zeichen verwendet werden.

Rob Breidecker
quelle
2
Ich benutze oft ¬- es ist immer noch eine Tastaturfigur in Großbritannien, wird aber selten wissentlich verwendet :) (oben links zwischen Escund Tab)
Andi Mohr
Benutzer können weiterhin Daten mit Buchstaben senden, die sich nicht auf der Tastatur befinden. Diese Antwort klingt verdächtig wie ein Vorschlag, um zu vermeiden, das Problem tatsächlich zu lösen ...
Binki
0

Verwenden Sie Folgendes.

Verwenden Sie die Escape-Taste, damit Benutzereingaben unverändert suchen können, da alle Sonderzeichen nachfolgend ersetzt werden müssen (siehe unten den gesamten SQL Server).

Hier wird ein einfaches Anführungszeichen "'" nicht verwendet, da es die like-Klausel nicht beeinflusst, da es sich um eine Verkettung von Zeichenfolgen handelt.

"-" & "^" & "]" Ersetzen ist nicht erforderlich, da wir "[" entkommen.

String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");

In SQL Query sollte es dann wie folgt aussehen. (In der parametrisierten Abfrage kann eine Zeichenfolge nach dem obigen Ersetzen mit Mustern hinzugefügt werden.)

Um die genaue Zeichenfolge zu suchen.

like 'FormattedString' ESCAPE 'ð'

Um zu suchen, beginnen Sie mit einer Zeichenfolge

like '%FormattedString' ESCAPE 'ð'

Suche Ende mit String

like 'FormattedString%' ESCAPE 'ð'

Zu suchen enthalten mit Zeichenfolge

like '%FormattedString%' ESCAPE 'ð'

und so weiter für andere Mustervergleiche. Direkte Benutzereingaben müssen jedoch wie oben erwähnt formatiert werden.

Anonymer Schöpfer
quelle
0

Darin liegt ein Problem:

LIKE 'WC[[]R]S123456' 

und:

LIKE 'WC\[R]S123456' ESCAPE '\'

Beide funktionieren für SQL Server, aber nicht für Oracle.

Es scheint, dass es keine ISO / IEC 9075-Methode gibt, um ein Muster mit einer linken Klammer zu erkennen.

Questbewusst
quelle