web-dev-qa-db-fra.com

SQL Server LIKE contenant des caractères entre crochets

Utilisation de SQL Server 2008. J'ai un tableau avec la colonne suivante:

sampleData (nvarchar(max))

La valeur de cette colonne dans certaines de ces lignes est des listes formatées comme suit:

["value1","value2","value3"]

J'essaie d'écrire une requête simple qui retournera toutes les lignes avec des listes formatées comme ceci, en détectant simplement le crochet d'ouverture.

SELECT * from sampleTable where sampleData like '[%'

La requête ci-dessus ne fonctionne pas parce que "[" est un caractère spécial, et je ne peux pas pour la vie de moi-même comprendre comment échapper au crochet afin que ma requête fasse ce que je veux.

Merci pour toutes suggestions!

50
CJS
 ... like '[[]%'

Tu utilises [ ] pour entourer un caractère spécial (ou une plage)

Consultez la section "Utilisation de caractères génériques comme littéraux" dans SQL Server LIKE

Modifier, 24 novembre 2011

Remarque: Vous n'avez pas besoin d'échapper au support de fermeture ...

78
gbn

Mis à part la réponse de gbn, l'autre méthode consiste à utiliser l'option ESCAPE:

SELECT * from sampleTable where sampleData like '\[%' ESCAPE '\'

Voir documentation pour plus de détails

29
Ed Harper

Juste une autre note ici ... Si vous souhaitez inclure le crochet (ou d'autres spéciaux) dans un jeu de caractères, vous avez seulement la possibilité d'utiliser ESCAPE (puisque vous utilisez déjà les crochets pour indiquer le jeu). Vous DEVEZ également spécifier la clause ESCAPE, car il n'y a pas de caractère d'échappement par défaut (ce n'est pas une barre oblique inverse par défaut comme je l'ai d'abord pensé, provenant d'un arrière-plan C).

par exemple. si je veux extraire des lignes où une colonne contient quoi que ce soit en dehors d'un ensemble de caractères "acceptables", pour des raisons disons alphanumériques ... nous pourrions commencer par ceci

SELECT * FROM MyTest WHERE MyCol LIKE '%[^a-zA-Z0-9]%'

Nous renvoyons donc tout ce qui n'a pas de caractère dans la liste (en raison du caractère caret ^).

Si nous voulons ensuite ajouter des caractères spéciaux dans cet ensemble de caractères acceptables, nous ne pouvons pas imbriquer les crochets, nous devons donc utiliser un caractère d'échappement, comme ceci ...

SELECT * FROM MyTest WHERE MyCol LIKE '%[^a-zA-Z0-9\[\]]%' ESCAPE '\'

Faire précéder les parenthèses (individuellement) d'une barre oblique inverse et indiquer que nous utilisons une barre oblique inverse pour le caractère d'échappement nous permet de les échapper dans les parenthèses fonctionnelles indiquant l'ensemble de caractères.

Désolé pour l'exemple stupide, mais j'espère que cela aide quelqu'un

3
KeithFearnley