webentwicklung-frage-antwort-db.com.de

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

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

Zum Beispiel: WC[R]S123456.

Wenn ich einen LIKE 'WC[R]S123456' mache, wird nichts zurückgegeben.

Ich habe einige Informationen zur Verwendung des ESCAPE-Schlüsselworts mit LIKE gefunden, aber ich verstehe nicht, wie man die eckigen Klammern als reguläre Zeichenfolge behandelt.

192
Travis
LIKE 'WC[[]R]S123456' 

oder

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

Sollte arbeiten.

273
Otávio Décio

Angenommen, Sie möchten das Literal its[brac]et abgleichen.

Sie müssen das ] nicht entgehen, da es nur dann eine besondere Bedeutung hat, wenn es mit [ gekoppelt ist.

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

97
Amitesh

Ich musste Namen, die mit einem Unterstrich angefangen haben, von einer Abfrage ausschließen.

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character
26
Andrew Backer

Folgendes habe ich tatsächlich verwendet:

like 'WC![R]S123456' ESCAPE '!'
18
Travis

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 '\'
10
scottm

Laut Dokumentation :

Sie können das Platzhaltermuster verwenden, das Zeichen als Literal .__ verwendet. Zeichen. Um ein Platzhalterzeichen als Literalzeichen zu verwenden, Umschließen Sie das Platzhalterzeichen in Klammern.

Sie müssen diese drei Zeichen %_[ mit Escapezeichen versehen:

'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
3
Salman A

Wenn Sie Sonderzeichen wie '_' (Unterstrich), wie es in meinem Fall der Fall war, umschreiben müssten und Sie nicht in der Lage sind, eine ESCAPE-Klausel zu definieren, können Sie das Sonderzeichen einfügen Zeichen mit eckigen Klammern '[' und ']'.

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

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

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

2
ssurba

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

1
Rob Breidecker

Verwenden Sie Folgendes.

Verwenden Sie für die Benutzereingabe die Suche so, wie sie ist, und verwenden Sie die Escape-Funktion, um alle Sonderzeichen (die sich auf den gesamten SQL Server beziehen) zu ersetzen.

Hier wird das einfache Anführungszeichen "'" nicht verwendet, da es nicht auf die like-Klausel wirkt, da es sich um eine String-Verkettung handelt.

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

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

In SQL Query sollte es dann folgendermaßen aussehen. (Bei einer parametrisierten Abfrage kann nach obiger Ersetzung eine Zeichenfolge mit Mustern hinzugefügt werden.).

Exakte Zeichenfolge suchen.

like 'FormattedString' ESCAPE 'ð'

Um zu suchen, beginnen Sie mit dem String

like '%FormattedString' ESCAPE 'ð'

Ende mit string

like 'FormattedString%' ESCAPE 'ð'

Um zu suchen, enthalten Sie einen String

like '%FormattedString%' ESCAPE 'ð'

und so weiter für andere Musterübereinstimmung. Die direkte Benutzereingabe muss jedoch wie oben erwähnt formatiert werden.

0