IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Expression régulière en SQL sous ORACLE


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 198
    Points : 94
    Points
    94
    Par défaut Expression régulière en SQL sous ORACLE
    Bonjour,



    Je suis en train d'analyser la qualité de notre base de données et j'aurais besoins de vos connaissances SVP:

    Voici ma regex:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select PRENOM
    from  ma_table
    where  (not regexp_like(PRENOM ,'(^[a-z]+[ -]?)*[a-z]+$','i') or not regexp_like(trim(PRENOM) ,'^[a-z]+(( |-)?[a-z]+$)*','i'));
    Je n'ai pas su mattre un seule regex.
    Je veux tester le prénom (pas de caractères spéciaux)
    par contre des prénoms du genre par ex :
    Nathalie B.
    L'hssen
    Anne-marie

    sont acceptés

    Merci pour votre aide.

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Salut,

    Je ne vais pas pouvoir te donner une solution car manipuler les regexp n'est jamais facile mais as-tu testé chacune de tes regexp une par une, et, surtout, étape par étape?

    Oui, je sais, c'est pas clair : regexp_like est formé de deux fonctions, REGEXP puis LIKE. Quand on utilise regexp_like, on connait les paramètres en entrée de la première fonction (nom colonne et expression régulière) puis la sortie de la deuxième fonction (le like donc le résultat à l'écran). Le problème est qu'il manque le résultat en sortie de la fonction regexp et c'est là où on a le plus de problème car souvent on s'est planté en saisissant sa regexp.

    Je te conseille donc de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT regexp_SUBSTR(PRENOM ,'(^[a-z]+[ -]?)*[a-z]+$','i') from dual;
    pour tester ta regexp numéro 1 puis de faire de même pour la numéro 2. Peut-être que tu verras où est l'erreur; c'est comme ça que je procède toujours.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2012
    Messages : 127
    Points : 339
    Points
    339
    Par défaut
    Bonjour,

    Commencez par écrire précisément les règles auxquelles doit obéir votre chaîne de caractères, et ensuite seulement transcrivez-les en expression régulière en vous aidant de ce guide.


    Je remarque que dans la première de vos expressions, (^[a-z]+[ -]?)*[a-z]+$, le symbole ^ qui code le début de la chaîne de caractère n'est pas au début de l'expression, mais dans un bloc entre parenthèses qui est suivi du caractère *, qui signifie que l'expression qui précède peut être présente 0 ou plusieurs fois (mais une chose est sûre, une chaîne de caractère n'a qu'un seul début). Donc, si j'ôte la partie optionnelle, reste [a-z]+$ : cette première expression teste si la chaîne de caractère se termine par au moins une lettre.

    Dans la seconde, ^[a-z]+(( |-)?[a-z]+$)*, c'est le symbole $ qui code la fin de la chaîne de caractère qui se trouve dans une expression pouvant être présente 0 ou plusieurs fois (et là encore, une chaîne de caractères n'a qu'une seule fin). Si j'ôte la partie optionnelle, reste ^[a-z]+ : cette deuxième expression teste si la chaîne de caractère commence par au moins une lettre.


    Je remarque également que dans le premier cas, vous appelez l'expression sur la colonne pren, et que dans le deuxième, vous l'appelez sur trim(pren), enlevant ainsi les espaces au début et à la fin de la chaîne de caractère avant de faire le regexp_like.

    Pour finir, d'après ce que j'ai compris de votre besoin, je conseillerai de faire quelque chose de ce genre :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT prenom
    FROM  ma_table
    WHERE NOT regexp_like(trim(prenom),'^([a-z]+( |-|''|\.)?)+$','i');

    Cette expression régulière vérifie que la chaîne de caractère est composée d'au moins une suite de lettres, terminée éventuellement par un séparateur (l'espace le point, l'apostrophe ou le tiret, liste à compléter si besoin), ce motif pouvant être répété à volonté. Les autres caractères sont interdits, ainsi que la succession de séparateurs (si vous souhaitez acceptez les chaînes où deux séparateurs ou plus se suivent, il suffit de remplacer ? par *)

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Juste pour signaler un excellent tutoriel (en anglais): Regular Expression Tutorial

  5. #5
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Je conseille ce livre qui est excellent et, en plus, en français : https://www.amazon.fr/expressions-r%...ct_top?ie=UTF8

    Il ne parle pas d'Oracle (pas gênant) mais c'est passionnant et on est pris par la main pour progresser dans cet univers difficile.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  6. #6
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 198
    Points : 94
    Points
    94
    Par défaut
    Merci beaucoup pour votre aide et surtout pour vos liens, je vais lire la doc pour mieux comprendre les expressions régulères.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Expressions régulières] validation url sous JS
    Par Sayrus dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/02/2007, 08h46
  2. probleme requete sql sous oracle 8
    Par bouclette dans le forum Oracle
    Réponses: 4
    Dernier message: 06/12/2006, 17h04
  3. Optimisation de requetes SQL sous oracle
    Par santana2006 dans le forum Oracle
    Réponses: 5
    Dernier message: 28/08/2006, 19h26
  4. Réponses: 4
    Dernier message: 18/01/2006, 10h33
  5. comment installer initjvm.sql sous Oracle 8i
    Par c_moi_c_moi dans le forum Oracle
    Réponses: 1
    Dernier message: 04/11/2005, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo