2009-01-13 8 views
157

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.Wie kann ich eckigen Klammern in einer LIKE-Klausel entkommen?

Zum Beispiel: WC[R]S123456.

Wenn ich ein LIKE 'WC[R]S123456' tun wird es nichts zurück.

Ich habe einige Informationen über die Verwendung der ESCAPE Schlüsselwort mit LIKE gefunden, aber ich verstehe nicht, wie man es verwendet, um die eckigen Klammern als eine normale Zeichenfolge zu behandeln.

+0

Ihre Frage hat mindestens '5' Stimmen für den [tag: like-Operator] Tag. Kann ich Sie bitten, [tag: sql-like] als [synonym] (http://stackoverflow.com/tags/like-operator/synonyms) zu empfehlen? – Kermit

Antwort

216
LIKE 'WC[[]R]S123456' 

oder

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

Sollte funktionieren. Hier

+6

Das Schlüsselwort ESCAPE ist erforderlich, wenn Sie ein benutzerdefiniertes Escape-Zeichen verwenden möchten (der Backslash ist in der Tat benutzerdefiniert). –

+3

@RyanKohn: http://meta.stackexchange.com/q/153241 –

+1

Danke für die Korrektur, @Ryan. – Shog9

17

ist, was ich wirklich gebraucht:

like 'WC![R]S123456' ESCAPE '!' 
8

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

Here's a good article with some more examples

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

-- or 

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

Ich brauchte Namen auszuschließen, die aus einer Abfrage mit einem Unterstrich begonnen, so endete ich mit diesem nach oben:

der
WHERE b.[name] not like '\_%' escape '\' -- use \ as the escape character 
+1

Ich musste diese Version verwenden (explizite Angabe des "Escape" -Zeichens) - die anderen Antworten hier ergaben nicht die richtigen Ergebnisse für mich. – MarcE

71

Lassen Sie sagen, Sie die wörtliche its[brac]et übereinstimmen soll.

Sie brauchen nicht die ] zu entkommen, da es nur 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 sie mit[[] ersetzen.

+5

Das war wirklich hilfreich und ich bin die beste Antwort. –

+5

[[] ist einfach komisch! Aber danke! –

2

statt ‚\‘ oder ein anderes Zeichen auf der Tastatur, können Sie auch Sonderzeichen, die nicht auf der Tastatur sind. Je nach Anwendungsfall kann dies erforderlich sein, wenn Benutzereingaben nicht versehentlich als Escape-Zeichen verwendet werden sollen.

+1

Ich benutze oft '¬' - es ist immer noch ein Keyboard-Charakter in Großbritannien, aber selten wissentlich verwendet :) (oben links zwischen' Esc' und 'Tab') –

1

Wenn Sie Sonderzeichen wie '_' (Unterstrich), wie es in meinem Fall war, und Sie sind nicht willens/nicht in der Lage, eine ESCAPE-Klausel zu definieren, möchten Sie möglicherweise die spezielle zu umarmen Charakter mit eckigen Klammern '[' und ']'.

Dies erklärt die Bedeutung des „weird“ string ‚[[]‘ - es umfasst nur den ‚[‘ Charakter mit eckigen Klammern, es effektiv zu entkommen.

Mein Anwendungsfall war der Name einer gespeicherten Prozedur mit Unterstrichen in es als Filterkriterien für die Profiler angeben.Also habe ich string '% name [_] von [_] a [_] gespeichert [_] procedure%' in einem TextData LIKE Feld und es gab mir Trace-Ergebnisse, die ich erreichen wollte.

Hier ist ein gutes Beispiel aus der Dokumentation: LIKE (Transact-SQL) - Using Wildcard Characters As Literals

1

Nach documentation:

Sie das Wildcard-Muster verwenden können Zeichen als wörtliche Zeichen übereinstimmen. Um ein Platzhalterzeichen als Literalzeichen zu verwenden, geben Sie das Platzhalterzeichen in Klammern ein.

Sie müssen diese 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