Je débute sur SQLite et je souhaiterais vérifier la validité des données de mes tables a l’aide de regex de façon intrinsèque dans leur définition. J’utilise actuellement le mot-clé CHECK associé à une condition LIKE, mais cette solution ne me permet par exemple pas de préciser le nombre de répétitions de certains morceaux de mon expression (dans le cas d’une expression destinée à vérifier un numéro de téléphone, par exemple). Je sais que c’est possible avec les regex, mais je ne sais pas comment m’y prendre pour les utiliser dans mon code SQL…
C’est probablement mieux de passer par une bibliothèque qui saura gérer complètement les numéros de téléphone, notamment au niveau international. Donc dans la partie code, et pas dans la partie SQL.
Pour l’exercice, je comprends, mais je ne l’aurais pas fait en utilisant SQLite.
Comme le dis @Moté, j’aurais validé les données depuis un programme.
Déjà car c’est possiblement plus rapide. Ensuite, c’est plus évolutif. Si la validation est plus compliquée qu’une regex (LIKE est même moins puissant qu’une regex) le changement à faire est moindre.
Au vu de la puissance de LIKE, je suis pas certain que ce que cherche à faire soit possible.
C’est un choix et il faudrait vérifier que techniquement c’est bien plus lent.
La validation n’empêche pas de vouloir normaliser les données et les deux sont orthogonales. Je veux dire par là que je peux vouloir que les numéros soient stockées sous une certaine forme (c’est ce que j’appelle normalisation ici) et m’assurer que c’est le cas même quand on tripote la base manuellement…
Effectivement, LIKE utilise des métacaractères et aucunement de l’expression rationnelle… chose pour laquelle il y a l’opérateur REGEXP qui enrobe la fonction utilisatrice regexp() non définie par défaut… Avec certaines distributions GNU/Linux, on a une cette fonction sous forme de bibliothèque que l’on peut charger en CLI
sqlite3 -cmd ".load /usr/lib/sqlite3/pcre.so"
L’usage des expression rationnelles n’est pas standardisées non plus (hormis je crois MATCH qui est défini dans POSIX SQL, REGEXP n’est pas très portable —beaucoup d’éditeurs utilisent ~ à la place par exemple— et peut souffrir des mêmes contraintes —de mémoire, sous SQL Server par exemple, il faut passer par une UDF— etc.)
…avec en prime quelques possibilités de groupement qui ressemblent aux expressions rationnelles.
Mais ça peut être suffisant pour le besoin, en plus d’avoir l’avantage d’être déjà intégré. Ce n’est cependant pas portable non plus.
GLOB
REGEXP
[aoeuiy]
[aoeuiy]
pareil
[0-9]
[0-9]
pareil
[d-f]
[d-f]
pareil
[!cb]
[^cb]
différent
{foo,bar} (ksh,bash,zsh)
(foo¦bar) (extended)
différent
{a,aa,aaa} (idem)
a{1,3} (idem)
différent
exemples vrai-faux amis
Je ne sais pas quelle est la traduction de globbing mais il s’agit toujours de métacaractères finalement.↩
Connectez-vous pour pouvoir poster un message.
Connexion
Pas encore membre ?
Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte