2016-01-13 5 views
1

У меня есть строка «ABC» Мне нужно разбить на строки, как показано нижеOracle SQL разбить строку на строки

A 
B 
C 

.Я знаю, как делать, когда разделителем присутствует. Как насчет того, когда разделитель нет

with test as 
(select 'A,B,C' col1 from dual) 
    select regexp_substr(col1, '[^,]+', 1, rownum) result1 
    from test 
    connect by level <= length(regexp_replace(col1, '[^,]+')) + 1; 
+0

Всегда ли это 3 символа, разделенные запятой после каждого? – sagi

+0

№. он является переменным. –

ответ

4

Без разделителей должны быть еще проще - использовать тот же подход, но просто использовать substr с level как индекс строки:

with test as 
(select 'ABC' col1 from dual) 
    select substr(col1, level, 1) result1 
    from test 
    connect by level <= length(col1); 
+0

Хотя он работает в строке, он не работает в нескольких рядах –

0

Вы можете используйте такую ​​функцию

-- define type 
CREATE OR REPLACE TYPE TABLE_OF_STRING AS TABLE OF VARCHAR2(32767); 

-- function 
function SPLIT_STRING_TO_STRINGS 
    (
    p_list varchar2, 
    p_delimiter varchar2 := ',' 
) return TABLE_OF_STRING pipelined 
    is 
    l_idx pls_integer; 
    l_list varchar2(32767) := p_list; 
    begin 
    loop 
     l_idx := instr(l_list, p_delimiter); 
     if l_idx > 0 then 
      pipe row(substr(l_list, 1, l_idx-1)); 
      l_list := substr(l_list, l_idx + length(p_delimiter)); 
     else 
      pipe row(l_list); 
      exit; 
     end if; 
    end loop; 
    return; 
    end SPLIT_STRING_TO_STRINGS; 

-- usage example 
select * from table(SPLIT_STRING_TO_STRINGS('A,B,C',','))