Конвертировать разделенную запятыми строку в массив в PL / SQL - PullRequest
36 голосов
/ 29 сентября 2010

Как мне преобразовать разделенную запятыми строку в массив?

У меня есть ввод '1,2,3', и мне нужно преобразовать его в массив.

Ответы [ 14 ]

0 голосов
/ 28 марта 2014

Другая возможность:

create or replace FUNCTION getNth (
  input varchar2,
  nth number
) RETURN varchar2 AS
  nthVal varchar2(80);
BEGIN
  with candidates (s,e,n) as (
      select 1, instr(input,',',1), 1 from dual
      union all
      select e+1, instr(input,',',e+1), n+1
        from candidates where e > 0)
  select substr(input,s,case when e > 0 then e-s else length(input) end) 
    into nthVal
    from candidates where n=nth;
  return nthVal;
END getNth;

Это немного слишком дорого для запуска, так как он вычисляет полный разбивку каждый раз, когда вызывающий абонент запрашивает один из элементов там ...

0 голосов
/ 25 ноября 2013

Я искал похожее решение, где у меня были многобайтовые символы (дефис, пробел, подчеркивание) в списках через запятую. Так что dbms_utility.comma_to_table у меня не сработало.

declare
  curr_val varchar2 (255 byte);
  input_str varchar2 (255 byte);
  remaining_str varchar2 (255 byte);
begin
  remaining_str := input_str || ',dummy';  -- this value won't output
  while (regexp_like (remaining_str, '.+,.+'))
  loop
    curr_val := substr (remaining_str, 1, instr (remaining_str, ',') - 1);
    remaining_str = substr (remaining_str, instr (remaining_str, ',') + 1);
    dbms_output.put_line (curr_val);
  end loop;
end;

Это не экспертный ответ, поэтому я надеюсь, что кто-то улучшит этот ответ.

0 голосов
/ 11 июля 2013
declare 
    v_str varchar2(100) := '1,2,3,4,6,7,8,9,0,';
    v_str1 varchar2(100); 
    v_comma_pos number := 0;    
    v_start_pos number := 1;
begin             
    loop        
    v_comma_pos := instr(v_str,',',v_start_pos);   
    v_str1 := substr(v_str,v_start_pos,(v_comma_pos - v_start_pos)); 
    dbms_output.put_line(v_str1);     
    if  v_comma_pos = 0 then     
    v_str1 := substr(v_str,v_start_pos);  
    dbms_output.put_line(v_str1);    
    exit;
    end if;    
    v_start_pos := v_comma_pos + 1;  
    if  v_comma_pos = 0 then    
    exit;
    end if;       
    end loop; 
end;
0 голосов
/ 29 сентября 2010

Быстрый поиск на моем BBDD привел меня к функции под названием split:

create or replace function split
( 
p_list varchar2, 
p_del varchar2 := ','
) 
return split_tbl pipelined
is 
l_idx pls_integer; 
l_list varchar2(32767) := p_list;AA 
l_value varchar2(32767);
begin 
loop 
l_idx := instr(l_list,p_del); 
if l_idx > 0 then 
pipe row(substr(l_list,1,l_idx-1)); 
l_list := substr(l_list,l_idx+length(p_del));
else 
pipe row(l_list); 
exit; 
end if; 
end loop; 
return;
end split;

Я не знаю, будет ли это полезно, но мы нашли это здесь ...

...