
REGEXP_LIKE en Oracle permet de filtrer des données avec des expressions régulières — une recherche de motif bien plus puissante que l’opérateur LIKE. Valider un e-mail, trouver les codes au mauvais format, détecter des caractères non numériques : voici comment utiliser REGEXP_LIKE avec des exemples concrets.
Syntaxe
SELECT * FROM clients
WHERE REGEXP_LIKE(colonne, motif [, options]);Renvoie les lignes où colonne correspond au motif (expression régulière).
REGEXP_LIKE vs LIKE
| LIKE | REGEXP_LIKE | |
|---|---|---|
| Jokers | % et _ | regex complète |
| Puissance | basique | élevée (classes, quantificateurs, alternatives) |
| Exemple | LIKE 'A%' | REGEXP_LIKE(c,'^[A-C]') |
Pour les recherches simples, gardez LIKE ; pour les motifs complexes, REGEXP_LIKE.
Exemples concrets
Valider un format d’e-mail
SELECT email FROM clients
WHERE NOT REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');
-- renvoie les e-mails MAL formésTrouver les valeurs non numériques
SELECT code FROM articles
WHERE NOT REGEXP_LIKE(code, '^[0-9]+$');Recherche insensible à la casse
SELECT * FROM clients
WHERE REGEXP_LIKE(nom, 'dupont', 'i'); -- 'i' = ignore la cassePlusieurs valeurs possibles (alternative)
SELECT * FROM tickets
WHERE REGEXP_LIKE(statut, '^(ouvert|en_cours|resolu)$');Les briques d’expression régulière utiles
^début,$fin de chaîne[0-9]un chiffre,[A-Za-z]une lettre,[[:digit:]]classe POSIX+1 ou plus,*0 ou plus,?0 ou 1,{2,4}entre 2 et 4.n’importe quel caractère,\dun chiffre (selon le moteur)|alternative (ou),( )groupe
Les options (3ᵉ paramètre)
'i': insensible à la casse'c': sensible à la casse (défaut)'m': mode multi-ligne'x': ignore les espaces du motif
La famille REGEXP d’Oracle
- REGEXP_LIKE : tester (cette page).
- REGEXP_REPLACE : remplacer selon un motif.
- REGEXP_SUBSTR : extraire la partie qui correspond.
- REGEXP_INSTR / REGEXP_COUNT : position / nombre d’occurrences.
FAQ
REGEXP_LIKE est-il plus lent que LIKE ?
Oui, légèrement : les expressions régulières coûtent plus cher. Pour un simple préfixe, gardez LIKE (qui peut aussi utiliser un index).
Peut-on indexer une recherche REGEXP ?
Pas directement avec un index B-tree classique. Pour de gros volumes, envisagez un index basé sur une fonction ou Oracle Text.
Comment valider un numéro de téléphone français ?
Par exemple : REGEXP_LIKE(tel, '^0[1-9]([ .-]?[0-9]{2}){4}$'), à adapter à votre format.
