web-dev-qa-db-fra.com

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

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

Par exemple: WC[R]S123456.

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

J'ai trouvé des informations sur l'utilisation du mot clé ESCAPE avec LIKE mais je ne comprends pas comment l'utiliser pour traiter les crochets comme une chaîne normale.

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

ou

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

Devrait marcher.

273
Otávio Décio

Supposons que vous vouliez correspondre au its[brac]et littéral.

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

Par conséquent, échapper à [ suffit à résoudre le problème. Vous pouvez échapper à [en le remplaçant par[[].

97
Amitesh

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

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

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

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

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

Selon documentation :

Vous pouvez utiliser les caractères de correspondance de modèle générique comme littéral personnages. Pour utiliser un caractère générique en tant que caractère littéral, mettez le caractère générique entre parenthèses.

Vous devez échapper à ces trois caractères %_[:

'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

Si vous deviez échapper à des caractères spéciaux tels que '_' (trait de soulignement), comme c'était le cas dans mon cas, et que vous ne souhaitiez pas/ne pouvais pas définir une clause ESCAPE, vous souhaiterez peut-être inclure le caractère spécial caractère entre crochets '[' _ et '' ''.

Cela explique la signification de la chaîne "étrange" '[[]' - 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 contenant des traits de soulignement en tant que critère de filtre pour le profileur. J'ai donc placé 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 souhaitais obtenir.

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

2
ssurba

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. Selon votre cas d'utilisation, cela peut être nécessaire si vous ne souhaitez pas que les entrées de l'utilisateur soient utilisées accidentellement comme caractère d'échappement.

1
Rob Breidecker

Utilisation suivante.

Pour que l’entrée utilisateur puisse effectuer la recherche telle quelle, utilisez échap, car elle nécessitera le remplacement suivant de tous les caractères spéciaux (ci-dessous couvre l’ensemble de 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.

"-" & "^" & "]" remplacer n'est pas nécessaire 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 une chaîne exacte.

like 'FormattedString' ESCAPE 'ð'

Pour chercher, commencez par une chaîne

like '%FormattedString' ESCAPE 'ð'

Pour chercher fin avec string

like 'FormattedString%' ESCAPE 'ð'

Pour rechercher contenir avec une chaîne

like '%FormattedString%' ESCAPE 'ð'

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

0
Anonymous Creator