1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| With MaTable as -- Données de départ
(
select 1 as cid, 'Capital repay EUR 0.4 + Special USD 0.67 + Special GBP 0.556' as col from dual union all
select 2 , 'Special EUR 0.445' from dual union all
select 3 , 'Special GBP 0.597 + Capital repay EUR 0.4 + Special USD 0.712456' from dual
)
, Lst as -- Nombre d'occurences max
(
select max(length(col) - length(replace(col, '+', '')) + 1) as nb_occ
from MaTable
)
, Cpt as -- Génération de nombres de 1 à nb_occurences
(
select level as nm
from Lst
connect by level <= nb_occ
)
, Reg as -- Utilisation de regexp pour extraire la partie de la chaîne qui nous intéresse
(
select cid
, nm as pos
, regexp_substr(col, 'Special [[:upper:]]{3} [[:digit:]]{1}.[[:digit:]]*', 1, nm) as ext
from MaTable
cross join Cpt
)
select cid -- Mise en forme finale
, pos
, substr(ext, 9, 3) as monnaie
, substr(ext, 13) as montant
from Reg
where ext is not null
order by cid asc
, pos asc;
CID POS MONNAIE MONTANT
--- --- ------- --------
1 1 USD 0.67
1 2 GBP 0.556
2 1 EUR 0.445
3 1 GBP 0.597
3 2 USD 0.712456 |
Partager