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 :

REGEXP_SUBSTR - Je suis null en expressions régulières


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 38
    Points : 37
    Points
    37
    Par défaut REGEXP_SUBSTR - Je suis null en expressions régulières
    Bonjour à tous,

    J'ai besoin d'aide en expressions régulières, en utilisant la fonction REGEXP_SUBSTR.
    Je voudrais découper une chaîne, faire un "split" avec les expressions régulières.

    J'ai un champ VARCHAR2 qui se compose ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'NOM~PRENOM~ADRESSE~CODEPOSTAL~VILLE'
    Je voudrais découper ma chaîne pour avoir ces données dans des champs distincts.
    Vous allez me dire que je peux faire ça en PL/SQL, mais je persiste à vouloir utiliser les expressions régulières, pour faire ça avec un simple SELECT, à l'aide des expressions régulières

    Pour l'instant j'arrive à faire extraire le 1er et le 2eme champ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT REGEXP_SUBSTR(MONCHAMP,'[^~]+~') AS NOM
         , REGEXP_SUBSTR(MONCHAMP,'~[^~]+~') AS PRENOM
    FROM (SELECT 'NOM~PRENOM~ADRESSE~CODEPOSTAL~VILLE' MONCHAMP FROM DUAL)
    Qui me donne :
    NOM : NOM~
    PRENOM : ~PRENOM~

    J'aimerai ne pas avoir les séparateurs...

    Merci !

  2. #2
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 132
    Points
    132
    Par défaut
    Salut hubsm,

    Je n'ai pas regardé ton expression régulière. Je voulais juste dire que si tu voulais supprimer les ~ de ton résultat, tu peux utiliser un TRIM

    SELECT TRIM(BOTH '~' FROM '~hello le monde~') FROM DUAL devrait retourner hello le monde.

    A+

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Août 2010
    Messages : 44
    Points : 69
    Points
    69
    Par défaut
    Bonjour,


    Vous pouvez le faire en SQL et sans expression régulière, en utilisant les bonnes vieilles fonctions INSTR et SUBSTR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT SUBSTR(MONCHAMP,1,INSTR(MONCHAMP,'~')-1) AS NOM
             , SUBSTR(MONCHAMP,1,INSTR(MONCHAMP,'~',1,2)-1)  AS PRENOM
    FROM (SELECT 'NOM~PRENOM~ADRESSE~CODEPOSTAL~VILLE' MONCHAMP FROM DUAL)

    Cdlt,
    OD

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Merci OracleFan, je ne connaissais pas cette utilisation de la fonction TRIM

    Olivier, merci pour ta réponse.
    C'est ce que j'ai commencé à faire, mais ça me fait du code imbuvable, cela dit ça marche

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Finalement je pense que je vais utiliser une fonction stockée.
    J'apprendrai les expression régulières une autre fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    CREATE OR REPLACE function my_split(p_chaine in varchar2, p_separateur in varchar2, p_position in number) return varchar2 as
      debut number;
      fin number;
    begin
      if p_position = 1 then
        debut := 1;
      else
        debut := instr(p_chaine,p_separateur,1,p_position-1);
        if debut = 0 then
          return '';
        end if;
        debut := debut + length(p_separateur);
      end if;
      fin := instr(p_chaine,p_separateur,1,p_position);
      if fin = 0 then
        return substr(p_chaine,debut);
      else
        return substr(p_chaine,debut,fin-debut);
      end if;
    /

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    À mon avis la fonction n'est pas la meilleure solution sur un besoin aussi simple.

    Avec les REGEXP c'est enfantin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT REGEXP_SUBSTR(MONCHAMP,'[^~]+', 1, 1) AS NOM,
           REGEXP_SUBSTR(MONCHAMP,'[^~]+', 1, 2) AS PRENOM,
           REGEXP_SUBSTR(MONCHAMP,'[^~]+', 1, 3) AS ADRESSE,
           REGEXP_SUBSTR(MONCHAMP,'[^~]+', 1, 4) AS CODEPOSTAL,
           REGEXP_SUBSTR(MONCHAMP,'[^~]+', 1, 5) AS VILLE
      FROM 
           (SELECT 'NOM~PRENOM~ADRESSE~CODEPOSTAL~VILLE' MONCHAMP FROM DUAL);
    Avec SUBSTR / INSTR, la syntaxe est plus lourde mais est encore compréhensible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT SUBSTR(MONCHAMP,                              1, INSTR(MONCHAMP, '~', 1, 1)                              - 1) AS NOM,
           SUBSTR(MONCHAMP, INSTR(MONCHAMP, '~', 1, 1) + 1, INSTR(MONCHAMP, '~', 1, 2) - INSTR(MONCHAMP, '~', 1, 1) - 1) AS PRENOM,
           SUBSTR(MONCHAMP, INSTR(MONCHAMP, '~', 1, 2) + 1, INSTR(MONCHAMP, '~', 1, 3) - INSTR(MONCHAMP, '~', 1, 2) - 1) AS ADRESSE,
           SUBSTR(MONCHAMP, INSTR(MONCHAMP, '~', 1, 3) + 1, INSTR(MONCHAMP, '~', 1, 4) - INSTR(MONCHAMP, '~', 1, 3) - 1) AS CODEPOSTAL,
           SUBSTR(MONCHAMP, INSTR(MONCHAMP, '~', 1, 4) + 1, LENGTH(MONCHAMP)           - INSTR(MONCHAMP, '~', 1, 4)    ) AS VILLE
      FROM 
           (SELECT 'NOM~PRENOM~ADRESSE~CODEPOSTAL~VILLE' MONCHAMP FROM DUAL);

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Merci beaucoup Waldar !
    C'est exactement ce que je voulais faire
    J'aurai dû creusé un peu...

    Citation Envoyé par Waldar Voir le message
    À mon avis la fonction n'est pas la meilleure solution sur un besoin aussi simple.
    Je suis bien d'accord !

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

Discussions similaires

  1. Expression régulière regexp_substr
    Par Djene dans le forum SQL
    Réponses: 3
    Dernier message: 06/10/2011, 14h28
  2. Réponses: 6
    Dernier message: 18/05/2010, 17h46
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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