Comment puis-je échapper les crochets dans une clause LIKE?

237

J'essaie de filtrer les éléments avec une procédure stockée en utilisant comme. La colonne est un varchar (15). Les éléments que j'essaye de filtrer ont des crochets dans le nom.

Par exemple: WC[R]S123456.

Si je fais LIKE 'WC[R]S123456'ça, il ne retournera rien.

J'ai trouvé des informations sur l'utilisation du ESCAPEmot clé avec LIKEmais je ne comprends pas comment l'utiliser pour traiter les crochets comme une chaîne régulière.

Travis
la source

Réponses:

329
LIKE 'WC[[]R]S123456' 

ou

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

Devrait marcher.

Otávio Décio
la source
10
Le mot clé ESCAPE est obligatoire si vous souhaitez utiliser un caractère d'échappement personnalisé (la barre oblique inversée est en effet personnalisée).
Ryan Kohn
2
J'ai également corrigé l'autre partie de la réponse. SQL Fiddle avec les versions avant et après
Martin Smith
10
Si quelqu'un ne sait pas pourquoi le crochet doit être échappé, la documentation de LIKE indique qu'il est utilisé pour faire correspondre un seul caractère dans une plage ou un ensemble. Par exemple, l'utilisation LIKE '[fz]oo'correspondra à la fois à «foo» et à «zoo».
Développeur holistique du
3
Ce serait bien d'avoir une justification pour les deux dans la réponse. Il n'était pas immédiatement évident pour moi pourquoi le premier exemple fonctionnerait avant d'avoir lu la réponse d'Amitesh ci-dessous.
Don Jewett
1
Préférez LIKE 'WC\[R]S123456' ESCAPE '\'car il est plus lisible pour la maintenance.
Fire Druid
119

Disons que vous voulez faire correspondre le littéral its[brac]et.

Vous n'avez pas besoin d'échapper au ]car il n'a une signification particulière que lorsqu'il est associé [.

Il [suffit donc de s'échapper pour résoudre le problème. Vous pouvez vous échapper [ en le remplaçant par [[] .

Amitesh
la source
7
C'était vraiment utile et imo la meilleure réponse.
Jared Sol
1
[[]semble bizarre, mais cela a du sens lorsque vous le regardez du point de vue de l'analyseur. L'analyseur a une règle spécifique pour gérer les caractères entre [ ]. Ainsi, le texte its[brac]etsignifie: "Recherchez les chaînes consécutives suivantes:, its(appliquez la règle aux crochets:) brac, et" . D'un autre côté, its[[]brac]etsignifie: "Trouvez les chaînes consécutives suivantes:, its(appliquez la règle pour les crochets:) [, brac]et" .
Brian
28

J'avais besoin d'exclure des noms commençant par un trait de soulignement d'une requête, donc je me suis retrouvé avec ceci:

WHERE b.[name] not like '\_%' escape '\'  -- use \ as the escape character
Andrew Backer
la source
2
J'ai dû utiliser cette version (en spécifiant explicitement le caractère "d'échappement") - les autres réponses ici n'ont pas donné les bons résultats pour moi.
MarcE
20

Voici ce que j'ai réellement utilisé:

like 'WC![R]S123456' ESCAPE '!'
Travis
la source
15

Le mot clé ESCAPE est utilisé si vous devez rechercher des caractères spéciaux tels que% et _, qui sont normalement des caractères génériques. Si vous spécifiez ESCAPE, SQL recherchera littéralement les caractères% et _.

Voici un bon article avec quelques exemples supplémentaires

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

-- or 

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

Si vous devez échapper des caractères spéciaux comme «_» (soulignement), comme c'était le cas dans mon cas, et que vous ne souhaitez pas / ne pouvez pas définir de clause ESCAPE, vous pouvez mettre le caractère spécial entre crochets »[ ' et '] ' .

Cela explique la signification de la chaîne «bizarre» «[[]» - elle englobe simplement le caractère «[» entre crochets, ce qui lui échappe efficacement.

Mon cas d'utilisation était de spécifier le nom d'une procédure stockée avec des traits de soulignement en tant que critère de filtre pour le profileur. J'ai donc mis la chaîne '% name [_] de [_] une [_] procédure [_] stockée%' dans un champ TextData LIKE et cela m'a donné les résultats de trace que je voulais atteindre.

Voici un bon exemple de la documentation: LIKE (Transact-SQL) - Utilisation de caractères génériques comme littéraux

ssurba
la source
4

Selon la documentation :

Vous pouvez utiliser le caractère générique correspondant aux caractères correspondants en tant que caractères littéraux. Pour utiliser un caractère générique comme caractère littéral, mettez le caractère générique entre crochets.

Vous devez échapper à ces trois personnages %_[:

'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
la source
1

Au lieu de «\» ou d'un autre caractère du clavier, vous pouvez également utiliser des caractères spéciaux qui ne sont pas sur le clavier. En fonction de votre cas d'utilisation, cela peut être nécessaire si vous ne souhaitez pas que la saisie utilisateur soit accidentellement utilisée comme caractère d'échappement.

Rob Breidecker
la source
2
J'utilise souvent ¬- c'est toujours un caractère de clavier au Royaume-Uni mais rarement utilisé sciemment :) (en haut à gauche entre Escet Tab)
Andi Mohr
Les utilisateurs peuvent toujours soumettre des données contenant des lettres qui ne sont pas sur le clavier. Cette réponse ressemble étrangement à une suggestion pour éviter de réellement résoudre le problème…
binki
0

Utilisez Suivant.

Pour que la saisie par l'utilisateur effectue une recherche telle qu'elle est, utilisez escape, car elle nécessitera le remplacement suivant pour tous les caractères spéciaux (ci-dessous couvre tout SQL Server).

Ici, les guillemets simples "" ne sont pas pris car ils n'affectent pas la même clause car il s'agit d'une concaténation de chaînes.

"-" & "^" & "]" n'est pas requis car nous échappons à "[".

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

Ensuite, dans SQL Query, cela devrait être comme suit. (Dans une requête paramétrée, une chaîne peut être ajoutée avec des modèles après le remplacement ci-dessus).

Pour rechercher la chaîne exacte.

like 'FormattedString' ESCAPE 'ð'

Pour commencer la recherche avec une chaîne

like '%FormattedString' ESCAPE 'ð'

Pour rechercher fin avec chaîne

like 'FormattedString%' ESCAPE 'ð'

Pour rechercher contient avec chaîne

like '%FormattedString%' ESCAPE 'ð'

et ainsi de suite pour d'autres correspondances de motifs. Mais la saisie directe par l'utilisateur doit être formatée comme mentionné ci-dessus.

Créateur anonyme
la source
0

Il y a un problème en cela:

LIKE 'WC[[]R]S123456' 

et:

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

Les deux fonctionnent pour SQL Server mais aucun ne fonctionne pour Oracle.

Il semble qu'il n'y ait aucun moyen ISO / CEI 9075 de reconnaître un motif impliquant une accolade gauche.

questaware
la source