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 REGEXP_REPLACE


Sujet :

SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Expression régulière REGEXP_REPLACE
    Bonjour à tous,

    J'ai un besoin très simple mais pas si évident à mettre en pratique car je ne maîtrise pas le sujet...

    Je pars d'une chaine de caractères représentant une projection de SELECT :
    Forme -> 'expression_1 AS nom_champ_1, expression_2 AS nom_champ_2, ..., expression_N AS nom_champ_N'
    Exemple -> 'qdqslmkdm (,) AS toto, sdfjkdfsjé"$) AS titi, 564é"ed AS tata'

    Et je souhaite en extraire le nom des colonnes uniquement :
    Forme -> 'nom_champ_1, nom_champ_2, ..., nom_champ_N'
    Exemple -> 'toto, titi, tata'

    J'ai trouvé quelques solutions :
    1 - Avec une requête hiérarchique -> pas retenue car trop couteux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT REGEXP_SUBSTR(str, '[^( AS )]+,', 1, LEVEL) AS substr
    FROM (
        SELECT 'qdqslmkdm (,) AS toto, sdfjkdfsjé"$) AS titi, 564é"ed AS tata,' AS str FROM DUAL
    )
    WHERE REGEXP_SUBSTR(str, '[^( AS )]+,', 1, LEVEL) IS NOT NULL
    CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str, '[^( AS )]+,')) + 1;
    2 - En combinant plusieurs REGEXP_REPLACE -> déjà mieux mais je suis sûr qu'on peut simplifier en une seule expression...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
        REGEXP_REPLACE('qdqslmkdm (,) AS toto, sdfjkdfsjé"$) AS titi, 564é"ed AS tata,'
                     , '(' || REGEXP_REPLACE(REGEXP_REPLACE('qdqslmkdm (,) AS toto, sdfjkdfsjé"$) AS titi, 564é"ed AS tata,'
                                                          , '([^( AS )]+,)'
                                                          , '|')
                                           , '([()$])'
                                           , '\\\1') || ')'
                     , '') 
    FROM dual
    Avec-vous une idée pour réaliser cela en une seule passe de REGEXP_REPLACE ?

    J'ai passé des heures de lecture de doc, tests, recherches sur le net... Mais je n'y arrive pas... Les groupes de capture ne me sortent que la dernière occurrence du pattern à extraire...

    Merci d'avance

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    La 1ère requête avec connect by level n'est pas correcte pour plus d'une ligne.
    Il faut la modifier comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT REGEXP_SUBSTR(str, '[^( AS )]+,', 1, LEVEL) AS substr
      FROM (
            SELECT 'qdqslmkdm (,) AS toto, sdfjkdfsjé"$) AS titi, 564é"ed AS tata,' AS str FROM DUAL union all
            SELECT 'qdqslmkdm (,) AS c1, sdfjkdfsjé"$) AS c2, 564é"ed AS c3,' AS str FROM DUAL
            )
     WHERE REGEXP_SUBSTR(str, '[^( AS )]+,', 1, LEVEL) IS NOT NULL
    CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str, '[^( AS )]+,')) + 1
        AND str = prior str
        AND prior sys_guid() IS NOT NULL ;
    Ou alors s'inspirer des propositions de ce post :
    oracle split varchar

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    En fait, je ne veux pas utiliser de requête hiérarchique car trop couteux et peu intégrable dans ma vue qui est déjà assez complexe.

    Je cherche vraiment une solution basée uniquement sur un seul appel de la fonction REGEXP_REPLACE.

    C'est forcément possible...

    Mais merci quand même.

    Si un master regex passe par ici...

  4. #4
    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
    Combien de lignes avez-vous à traiter ?
    Car la requête hiérarchique, oui ça peut être un peu long - bien qu'il existe des moyens de l'optimiser - mais si c'est pour traiter 1000 lignes vous allez perdre plus de temps à trouver la bonne expression régulière.

Discussions similaires

  1. [RegEx] Expression régulières : Balises <SCRIPT>
    Par Gwipi dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2006, 23h25
  2. Expression réguliére
    Par Mad_Max dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 16/09/2003, 18h17
  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