SQL like - sélectionner des chaînes qui contiennent des caractères non spécifié
Tout d'abord, toutes mes excuses si c'est une double question. J'ai fait de mon mieux pour la recherche, mais en vain, et je ne pouvais même pas correctement mot à ma question en termes de mots-clés!
Un de mes tableaux a une colonne Name (nvarchar)
. Je veux trouver les lignes qui contiennent des caractères spéciaux sans explicitement liste de ces caractères. Des caractères "spéciaux" dans mon cas, signifie ce qui n'est pas dans:
a-z A-Z 0-9 _ @ . , ( ) % + -
Ainsi, par exemple:
Row 1: 'asdf Asdf 0123'
Row 2: 'asdf (Asdf) 012/3'
Row 3: 'zxcv [234]'
Row 4: 'asdf #0123'
Je veux sélectionner les lignes 2, 3 et 4.
La façon la plus simple est d'inclure les personnages que je ne veux pas, par exemple crochets et slash:
SELECT * FROM Table
WHERE Name LIKE '%[\]\[/]%' ESCAPE '\'
Cela renvoie des lignes 2 et 3, ou si j'utilise AIME PAS, les lignes 1 et 4. Cependant, je tiens également à trouver d'autres personnages que je ne peut pas avoir pensé (comme le #). Liste des personnages qui SONT recherchées -
SELECT * FROM Table
WHERE Name NOT LIKE '%[a-zA-Z0-9_@. ,()%+-]%'
ne fonctionne pas non plus, car il renvoie 0 résultats depuis toutes les lignes qui contiennent au moins 1 de ces personnages.
Est-il un moyen de restreindre le dernier COMME instruction de ne pas correspondre à tout chaîne de caractères qui contient des caractères souhaités, mais plutôt des chaînes de caractères qui contiennent seulement les caractères désirés et rien d'autre?
- Ce SGBD que vous utilisez?
- SQL server, mais je pense que cela ne devrait pas être dépend de SGBD. Aussi, je pense que j'ai juste trouvé une solution que je vais poster si elle est correcte.
Vous devez vous connecter pour publier un commentaire.
Dans MySQL, vous pouvez faire:
Ne sais pas si le même opérateur REGEX existe dans SQL Server, mais il a probablement quelque chose de similaire.
WHERE Name LIKE '%[^a-zA-Z0-9_@. ,()%+-]%'
que par cette page w3schools.com/sql/sql_wildcards.asp . Je l'avais déjà vu et essayé avant de poser cette question mais pour une raison quelconque n'ont pas eu droit. De toute façon, c'est à peu près ce que je cherchais, merci! 🙂SELECT * FROM tblWHERE PATINDEX('%[^a-zA-Z0-9]%',col) >1
Doit retourner les lignes qui ont des caractères alpha numériques. Vous devrez peut-être modifier la regex pour vos besoins spécifiques.
LIKE
vsPATINDEX
- son n'est pas plus complexe qu'unlike
vraiment, juste un appel de fonction, au lieu d'un prédicat. J'ai lu des résultats mitigés au sujet de la performance relative des deux méthodes, l'une d'entre eux peut vous donner des résultats plus rapides...