Consider the data set
with t as
(
select 101 job_id, 'P00O0496,,P00O0828,P00O2739,P00O3522,P00O4405,P00O7182,P00U1375' str from dual union all
select 102 job_id, 'P00O0496,,P00O0828,P00O2739,P00O3522,P00O4405,P00U1375' from dual
(
select 101 job_id, 'P00O0496,,P00O0828,P00O2739,P00O3522,P00O4405,P00O7182,P00U1375' str from dual union all
select 102 job_id, 'P00O0496,,P00O0828,P00O2739,P00O3522,P00O4405,P00U1375' from dual
union all
select 103 job_id,'UUKGQ068,UUKGQ069,UUKGQ071,UUKGQ075,UUKGQ077,
select 103 job_id,'UUKGQ068,UUKGQ069,UUKGQ071,UUKGQ075,UUKGQ077,
UUKGQ083,,,,UUMO12430' from dual
)
)
Note: Null Values should not be displayed in the result set.
The output should be as shown below
JOB_ID STR
---------------------- ----------
101 P00O0496
101 P00O0828
101 P00O2739
101 P00O3522
101 P00O4405
101 P00O7182
101 P00U1375
102 P00O0496
102 P00O0828
102 P00O2739
102 P00O3522
102 P00O4405
102 P00U1375
103 UUKGQ068
103 UUKGQ069
103 UUKGQ071
103 UUKGQ075
103 UUKGQ077
103 UUKGQ083
103 UUMO12430
20 rows selected
---------------------- ----------
101 P00O0496
101 P00O0828
101 P00O2739
101 P00O3522
101 P00O4405
101 P00O7182
101 P00U1375
102 P00O0496
102 P00O0828
102 P00O2739
102 P00O3522
102 P00O4405
102 P00U1375
103 UUKGQ068
103 UUKGQ069
103 UUKGQ071
103 UUKGQ075
103 UUKGQ077
103 UUKGQ083
103 UUMO12430
20 rows selected
There are two known ways to do this
Method 1: Using Regular expressions and Connect by clause
{Code }
select job_id, regexp_substr(yourcolumn,'[^,]+',1,r) yourvalue , r
from yourtable,
(select rownum r from dual connect by rownum <= 100) max_users
where
r<= length(regexp_replace(yourcolumn,'[^,]')) +1 -- stop condition for max_users
and regexp_substr(yourcolumn,'[^,]+',1,r) is not null -- show only real values
order by job_id
,r -- you need ordering by r, if you want to keep original order of your values
;
from yourtable,
(select rownum r from dual connect by rownum <= 100) max_users
where
r<= length(regexp_replace(yourcolumn,'[^,]')) +1 -- stop condition for max_users
and regexp_substr(yourcolumn,'[^,]+',1,r) is not null -- show only real values
order by job_id
,r -- you need ordering by r, if you want to keep original order of your values
;
{/Code }
Method 2: Converting data set into XML and parsing it
{Code }
select job_id, x.str
from t,
xmltable('e' passing xmltype('<e><e>' || replace(str, ',', '</e><e>') || '</e></e>').extract('e/e')
columns str varchar2(10) path '.') x
where x.str is not null;
from t,
xmltable('e' passing xmltype('<e><e>' || replace(str, ',', '</e><e>') || '</e></e>').extract('e/e')
columns str varchar2(10) path '.') x
where x.str is not null;
{/Code }