Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Solution de contournement des expressions régulières SQL Server dans T-SQL ?

Malheureusement, vous ne pourrez pas déplacer vos fonctions CLR vers SQL Azure. Vous devrez soit utiliser les fonctions de chaîne normales (PATINDEX, CHARINDEX, LIKE, etc.), soit effectuer ces opérations en dehors de la base de données.

MODIFIER Ajout d'informations pour les exemples ajoutés à la question.

Adresse e-mail

Celui-ci est toujours controversé car les gens ne sont pas d'accord sur la version du RFC qu'ils veulent prendre en charge. L'original ne supportait pas les apostrophes, par exemple (ou du moins les gens insistent sur le fait que ce n'était pas le cas - je ne l'ai pas déterré des archives et je ne l'ai pas lu moi-même, certes), et il doit être étendu assez souvent pour de nouveaux TLD (une fois pour les TLD à 4 lettres comme .info, puis à nouveau pour les TLD à 6 lettres comme .museum). J'ai souvent entendu des gens bien informés affirmer qu'une validation parfaite des e-mails est impossible, et ayant déjà travaillé pour un fournisseur de services de messagerie, je peux vous dire que c'était une cible en constante évolution. Mais pour les approches les plus simples, voir la question TSQL Email Validation (sans regex ) .

Un chiffre numérique

Probablement le plus simple du groupe :

WHERE @s LIKE '[0-9]';

Numéros de carte de crédit

En supposant que vous supprimiez les tirets et les espaces, ce que vous devriez faire dans tous les cas. Notez qu'il ne s'agit pas d'une vérification réelle de l'algorithme du numéro de carte de crédit pour s'assurer que le numéro lui-même est réellement valide, mais simplement qu'il est conforme au format général (AmEx =15 chiffres commençant par un 3, le reste étant composé de 16 chiffres - Visa commence par un 4, MasterCard commence par un 5, Discover commence par un 6 et je pense qu'il y en a une qui commence par un 7 (bien qu'il puisse s'agir simplement de cartes-cadeaux) :

WHERE @s + ' ' LIKE '[3-7]'+ REPLICATE('[0-9]', 14) + '[0-9 ]';

Si vous voulez être un peu plus précis au prix d'être long, vous pouvez dire :

WHERE (LEN(@s) = 15 AND @s LIKE '3'     + REPLICATE('[0-9]', 14))
   OR (LEN(@s) = 16 AND @s LIKE '[4-7]' + REPLICATE('[0-9]', 15));

Numéros de téléphone aux États-Unis

Encore une fois, en supposant que vous allez d'abord supprimer les parenthèses, les tirets et les espaces. Assez sûr qu'un indicatif régional américain ne peut pas commencer par un 1 ; s'il y a d'autres règles, je ne les connais pas.

WHERE @s LIKE '[2-9]' + REPLICATE('[0-9]', 9);

-----

Je n'irai pas plus loin, car beaucoup d'autres expressions que vous avez définies peuvent être extrapolées à partir de ce qui précède. J'espère que cela vous donne un début. Vous devriez pouvoir rechercher sur Google certains des autres pour voir comment d'autres personnes ont répliqué les modèles avec T-SQL. Certains d'entre eux (comme les jours de la semaine) peuvent probablement être vérifiés par rapport à une table - il semble exagéré de faire une correspondance de modèle d'invasion pour un ensemble de 7 valeurs possibles. De même avec une liste de 1000 nombres ou années, ce sont des choses qui seront beaucoup plus faciles (et probablement plus efficaces) pour vérifier si la valeur numérique est dans une table plutôt que de la convertir en une chaîne et de voir si elle correspond à un modèle.

Je répète qu'une grande partie de cela sera bien meilleure si vous pouvez nettoyer et valider les données avant qu'elles n'entrent dans la base de données en premier lieu. Vous devez vous efforcer de le faire dans la mesure du possible, car sans CLR, vous ne pouvez tout simplement pas faire de puissantes RegEx dans SQL Server.