Come posso evitare parentesi quadre in una clausola LIKE?

Sto cercando di filtrare gli elementi con una stored procedure usando mi piace. La colonna è un varchar (15). Gli elementi che sto cercando di filtrare hanno parentesi quadre nel nome.

Ad esempio: WC[R]S123456 .

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

Ho trovato alcune informazioni sull’utilizzo della parola chiave ESCAPE con LIKE ma non capisco come usarlo per trattare le parentesi quadre come una stringa normale.

 LIKE 'WC[[]R]S123456' 

o

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

Dovrebbe funzionare.

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

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

Quindi sfuggire [ sufficiente per risolvere il problema. Puoi scappare [ sostituendolo con [[] .

Avevo bisogno di escludere i nomi iniziati con un underscore da una query, quindi ho finito con questo:

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

Ecco cosa ho effettivamente usato:

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

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

Secondo la documentazione :

È ansible utilizzare i caratteri jolly che corrispondono ai caratteri come caratteri letterali. Per utilizzare un carattere jolly come carattere letterale, racchiudere tra parentesi il carattere jolly.

Devi sfuggire questi tre caratteri %_[ :

 '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 

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

Se dovessi sfuggire 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 con parentesi quadre ‘[ ‘ e ‘] ‘ .

Questo spiega il significato della “strana” stringa “[[]” – abbraccia semplicemente il carattere “[“ con parentesi quadre, evitandole efficacemente.

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

Ecco un buon esempio dalla documentazione: LIKE (Transact-SQL) – Utilizzo di caratteri jolly come letterali

Usa seguito.

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

Qui la virgoletta singola “” non è presa in quanto non influenza la clausola like in quanto è una questione di concatenazione di stringhe.

“-” & “^” & “]” non è necessario sostituire poiché stiamo sfuggendo “[“.

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

Quindi, in SQL Query dovrebbe essere il seguente. (Nella query parametrizzata, la stringa può essere aggiunta con i pattern dopo la sostituzione precedente).

Per cercare una stringa esatta.

 like 'FormattedString' ESCAPE 'ð' 

Per cercare inizia con una stringa

 like '%FormattedString' ESCAPE 'ð' 

Per cercare finisce con una stringa

 like 'FormattedString%' ESCAPE 'ð' 

Per cercare contiene con una stringa

 like '%FormattedString%' ESCAPE 'ð' 

e così via per altri pattern matching. Ma l’input dell’utente diretto deve essere formattato come menzionato sopra.