Если входная строка всегда выглядит так, как вы нам показали, то
- замените вторую запятую чем-то другим (например,
#
)
- разбить входную строку на
#
(вместо ,
)
level
в этом случае всегда будет <= 2
SQL> with test (col) as (select 'Kanodia, Gaurav,Punani, Rohit' from dual)
2 select regexp_substr(regexp_replace(col, ',', '#', 1, 2), '[^#]+', 1, level) res
3 from test
4 connect by level <= 2;
RES
-----------------------------
Kanodia, Gaurav
Punani, Rohit
SQL>
Если формат входной строки отличается, то вышеприведенное (очевидно) не будет работать должным образом.
[EDIT ]
Вот один из вариантов, как вы можете это делать. Я не очень хорош в сложных регулярных выражениях, поэтому я написал функцию, которая заменит даже запятые на #
, и позже использую эту функцию.
SQL> create or replace function f_rep (par_string in varchar2)
2 return varchar2
3 is
4 -- replace every second occurrence of a comma with a #
5 l_cnt number := regexp_count(par_string, ',');
6 l_str varchar2(100) := par_string;
7 begin
8 for i in 1 .. l_cnt loop
9 if mod(i, 2) = 0 then
10 l_str := regexp_replace(l_str, ',', '#', 1, (i/2)+1);
11 end if;
12 end loop;
13 return l_str;
14 end;
15 /
Function created.
SQL>
Этот запрос показывает, как избежать неправильного результата при наличии нескольких строк.
SQL> with test (col) as
2 (select 'Kanodia, Gaurav,Punani, Rohit,Singhal, Bhavya' from dual union all
3 select 'Little, Foot, MT0, DbFiddle' from dual union all
4 select 'January, February, March, April, May, June, July, August' from dual)
5 select
6 col,
7 trim(regexp_substr(f_rep(col), '[^#]+', 1, column_value)) repcol_split
8 from test,
9 table(cast(multiset(select level from dual
10 connect by level <= regexp_count(f_rep(col), '#') + 1
11 ) as sys.odcinumberlist));
COL REPCOL_SPLIT
-------------------------------------------------------- --------------------
Kanodia, Gaurav,Punani, Rohit,Singhal, Bhavya Kanodia, Gaurav
Kanodia, Gaurav,Punani, Rohit,Singhal, Bhavya Punani, Rohit
Kanodia, Gaurav,Punani, Rohit,Singhal, Bhavya Singhal, Bhavya
Little, Foot, MT0, DbFiddle Little, Foot
Little, Foot, MT0, DbFiddle MT0, DbFiddle
January, February, March, April, May, June, July, August January, February
January, February, March, April, May, June, July, August March, April
January, February, March, April, May, June, July, August May, June
January, February, March, April, May, June, July, August July, August
9 rows selected.
SQL>