SQL Server échappe un trait de soulignement

339

Comment puis-je échapper au caractère de soulignement?

J'écris quelque chose comme la clause where suivante et je veux pouvoir trouver des entrées réelles avec _d à la fin.

Where Username Like '%_d'
GateKiller
la source

Réponses:

525

Référence T-SQL pour LIKE :

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. Le tableau suivant montre plusieurs exemples d'utilisation du mot clé LIKE et des caractères génériques [].

Pour votre cas:

... LIKE '%[_]d'
Lasse V. Karlsen
la source
oh mec! ... si cela ne fonctionne toujours pas, assurez-vous que la colonne est à droite.
Jens Frandsen
198

Évidemment, la solution @Lasse a raison, mais il existe une autre façon de résoudre votre problème: l'opérateur T-SQL LIKEdéfinit la clause ESCAPE facultative , qui vous permet de déclarer un caractère qui échappera au caractère suivant dans le modèle.

Pour votre cas, les clauses WHERE suivantes sont équivalentes:

WHERE username LIKE '%[_]d';            -- @Lasse solution
WHERE username LIKE '%$_d' ESCAPE '$';
WHERE username LIKE '%^_d' ESCAPE '^';
Gerardo Lima
la source
43
Pour compléter l'image: la ESCAPEclause fait partie de la norme SQL et fonctionnera sur n'importe quel SGBD, pas seulement sur SQL Server.
a_horse_with_no_name
2

Ces solutions ont tout à fait du sens. Malheureusement, aucun n'a fonctionné pour moi comme prévu. Au lieu d'essayer de m'embêter avec ça, je suis allé avec un travail autour:

select * from information_schema.columns 
where replace(table_name,'_','!') not like '%!%'
order by table_name
Tek Mailer
la source
2

Cela a fonctionné pour moi, utilisez simplement l'évasion '%\_%'

Arnór Barkarson
la source
0

Aucun de ceux-ci n'a fonctionné pour moi dans SSIS v18.0, donc je ferais quelque chose comme ceci:

WHERE CHARINDEX('_', thingyoursearching) < 1

.. où j'essaie d'ignorer les chaînes avec un soulignement en eux. Si vous voulez trouver des choses qui ont un trait de soulignement, il suffit de le retourner:

WHERE CHARINDEX('_', thingyoursearching) > 0

Wolverine87
la source