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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
set verify off
column str format a20
column str_final format a20
define p=4
WITH t AS
(SELECT '0,1,,3,4,5,,7,,,' str
FROM DUAL),
tt AS
(SELECT str, REGEXP_REPLACE (str||',', '[,]+', ',') chaine
FROM t),
r AS
(SELECT str, chaine, LENGTH (REGEXP_REPLACE (chaine, '[^,]+')) cpt
FROM tt),
r1 AS
(SELECT str, LEVEL lvl,
REGEXP_SUBSTR (chaine, '[^,]+', 1, LEVEL) elem
FROM r
CONNECT BY LEVEL <= cpt),
groupe AS
(SELECT str, elem, elem - ROW_NUMBER () OVER (ORDER BY lvl) + 1 grp
FROM r1),
resultat AS
(SELECT str, grp,
LTRIM
(MAX (SYS_CONNECT_BY_PATH (elem, ','))KEEP (DENSE_RANK LAST ORDER BY curr),
','
) AS str_final
FROM (SELECT str, grp, elem,
ROW_NUMBER () OVER (PARTITION BY grp ORDER BY str)
AS curr,
ROW_NUMBER () OVER (PARTITION BY grp ORDER BY grp)
- 1 AS prev
FROM groupe)
GROUP BY str, grp
CONNECT BY prev = PRIOR curr AND grp = PRIOR grp
START WITH curr = 1)
SELECT str, grp, str_final
FROM resultat
WHERE REGEXP_LIKE (str_final, &p) OR &p IS NULL;
STR GRP STR_FINAL
-------------------- ---------- --------------------
0,1,,3,4,5,,7,,, 1 3,4,5
1 row selected.
==========================================
avec DEFINE p=1
STR GRP STR_FINAL
-------------------- ---------- --------------------
0,1,,3,4,5,,7,,, 0 0,1
1 row selected.
avec DEFINE p=7
STR GRP STR_FINAL
-------------------- ---------- --------------------
0,1,,3,4,5,,7,,, 2 7
1 row selected. |
Partager