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