Come posso evitare le parentesi quadre in una clausola LIKE?


237

Sto cercando di filtrare gli elementi con una procedura memorizzata usando like. La colonna è un varchar (15). Gli elementi che sto cercando di filtrare hanno parentesi quadre nel nome.

Ad esempio: WC[R]S123456.

Se lo faccio LIKE 'WC[R]S123456'non restituirà nulla.

Ho trovato alcune informazioni sull'uso della ESCAPEparola chiave con LIKEma non capisco come usarlo per trattare le parentesi quadre come una stringa normale.

Risposte:


329
LIKE 'WC[[]R]S123456' 

o

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

Dovrebbe funzionare.


10
La parola chiave ESCAPE è necessaria se si desidera utilizzare un carattere di escape personalizzato (la barra rovesciata è effettivamente personalizzata).
Ryan Kohn,

2
Ho corretto anche l'altra parte della risposta. SQL Fiddle con versioni precedenti e successive
Martin Smith,

10
Se qualcuno non è chiaro sul motivo per cui la parentesi deve essere sfuggita, la documentazione per LIKE indica che viene utilizzato per abbinare un singolo carattere in un intervallo o set. Ad esempio, l'utilizzo LIKE '[fz]oo'corrisponderà a "pippo" e "zoo".
Sviluppatore olistico

3
Sarebbe bello avere una motivazione per entrambi nella risposta. Non fu immediatamente ovvio per me perché il primo esempio avrebbe funzionato fino a quando non avessi letto la risposta di Amitesh di seguito.
Don Jewett,

1
Preferisce LIKE 'WC\[R]S123456' ESCAPE '\'in quanto è più leggibile per la manutenzione.
Fire Druid

119

Diciamo che vuoi abbinare il letterale its[brac]et.

Non è necessario sfuggire a ]poiché ha un significato speciale solo quando è associato [.

Pertanto fuggire è [sufficiente per risolvere il problema. Puoi scappare [ sostituendolo con [[] .


7
Questa è stata davvero utile e ho trovato la migliore risposta.
Jared Sol,

1
[[]sembra strano, ma ha senso quando lo guardi dal punto di vista del parser. Il parser ha una regola specifica per come gestire i caratteri tra [ ]. Quindi, il testo its[brac]etsignifica: "Trova le seguenti stringhe consecutive:, its(applica la regola per le parentesi quadre:) brac, et" . D'altra parte, its[[]brac]etsignifica: "Trova le seguenti stringhe consecutive:, its(applica la regola per le parentesi quadre:) [, brac]et" .
Brian,

28

Avevo bisogno di escludere i nomi che erano iniziati con un trattino basso da una query, quindi ho finito con questo:

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

2
Ho dovuto usare questa versione (specificando esplicitamente il carattere "escape") - le altre risposte qui non mi hanno dato i risultati corretti.
MarcE,

20

Ecco cosa ho effettivamente usato:

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

15

La parola chiave ESCAPE viene utilizzata se è necessario cercare caratteri speciali come% e _, che sono normalmente caratteri jolly. Se si specifica ESCAPE, SQL cercherà letteralmente i caratteri% e _.

Ecco un buon articolo con alcuni altri esempi

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

-- or 

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

6

Se avessi bisogno di sfuggire a caratteri speciali come "_" (trattino basso), come nel mio caso, e non sei disposto / non in grado di definire una clausola ESCAPE, potresti voler racchiudere il carattere speciale tra parentesi quadre "[ ' e '] ' .

Questo spiega il significato della stringa "strana" '[[]' - abbraccia semplicemente il carattere '[' con parentesi quadre, scappandone efficacemente.

Il mio caso d'uso è stato quello di specificare il nome di una procedura memorizzata con caratteri di sottolineatura come criterio di filtro per il Profiler. Quindi ho inserito la stringa '% name [_] di [_] una [_] stored procedure [_]%' in un campo LIKE di TextData e mi ha dato i risultati di traccia che volevo ottenere.

Ecco un buon esempio dalla documentazione: LIKE (Transact-SQL) - Uso dei caratteri jolly come letterali


4

Secondo la documentazione :

È possibile utilizzare il modello jolly che abbina i caratteri come caratteri letterali. Per utilizzare un carattere jolly come carattere letterale, racchiudere il carattere jolly tra parentesi.

Devi scappare da questi tre personaggi %_[:

'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

1

Invece di '\' o un altro carattere sulla tastiera, puoi anche usare caratteri speciali che non sono sulla tastiera. A seconda del caso d'uso, questo potrebbe essere necessario, se non si desidera che l'input dell'utente venga utilizzato accidentalmente come carattere di escape.


2
Uso spesso ¬- è ancora un personaggio da tastiera nel Regno Unito ma raramente usato consapevolmente :) (in alto a sinistra tra Esce Tab)
Andi Mohr

Gli utenti possono comunque inviare dati contenenti lettere che non sono sulla tastiera. Questa risposta suona sospettosamente come un suggerimento per evitare di risolvere il problema ...
binki

0

Usa seguenti.

Per l'input dell'utente per la ricerca così com'è, utilizzare escape, in quanto richiederà la sostituzione successiva per tutti i caratteri speciali (di seguito copre tutto SQL Server).

Qui la virgoletta singola "" "non viene presa in quanto non influisce sulla clausola simile in quanto si tratta di concatenazione di stringhe.

"-" & "^" & "]" non è necessario in quanto stiamo scappando "[".

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

Quindi, in SQL Query dovrebbe essere il seguente. (Nella query con parametri, è possibile aggiungere una stringa con motivi dopo la sostituzione sopra).

Per cercare una stringa esatta.

like 'FormattedString' ESCAPE 'ð'

Per iniziare la ricerca inizia con una stringa

like '%FormattedString' ESCAPE 'ð'

Per cercare termina con stringa

like 'FormattedString%' ESCAPE 'ð'

Per cercare contiene con stringa

like '%FormattedString%' ESCAPE 'ð'

e così via per altri pattern matching. Ma l'input dell'utente diretto deve formattare come indicato sopra.


0

C'è un problema in questo mentre:

LIKE 'WC[[]R]S123456' 

e:

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

Entrambi funzionano per SQL Server ma non funzionano per Oracle.

Sembra che non vi sia alcun modo ISO / IEC 9075 per riconoscere un modello che coinvolge una parentesi graffa sinistra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.