SQLite & REGEX

a marqué ce sujet comme résolu.

Bonjour,

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…

Merci d’avance,

@flopy78

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.

+0 -0

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.

Moté

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…

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…

flopy78

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.)

Il semblerait que ce soit l’instruction GLOB qui permet de faire ça:

DonKnacki

L’opérateur GLOB est aussi du globbage1 mais bascule sur des métacaractères du SQL vers ceux du shell

SQL shell regexp
_ ? .
% * .*
glob vs regexp

…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

  1. Je ne sais pas quelle est la traduction de globbing mais il s’agit toujours de métacaractères finalement.
+2 -0
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