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
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 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;
Avec-vous une idée pour réaliser cela en une seule passe de REGEXP_REPLACE ?
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
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![]()
Partager