вторник, 6 ноября 2012 г.

Разбор/парсинг значения поля (строки) по разделителям на строки

Источник:  http://plsqlbook.ru/category/question-answer/


Простой пример того, о чем речь:
SELECT regexp_substr(str, '[^#]+', 1, LEVEL)
  FROM (SELECT 'one#two#tree' str FROM dual)
CONNECT BY instr(str, '#', 1, LEVEL-1) > 0
напоминалка:
  • ‘[^#]+’ такая маска найдет все символы кроме решетки
  • instr(str, ‘#’, 1, LEVEL-1) > 0 поиск позиции разделителя начиная с первой позиции и, видимо, с LEVEL = 2 (возвратит 0 если позиция при заданных параметрах не найдена)
  • CONNECT BY условие подсказывает ораклу как долго продолжать цикл
Результат:
1 one
2 two
3 tree
 
 
Вариант 2
 
select 
   ltrim(rtrim(
    substr(s_element,
         instr(s_element,',',1,iter.pos)+1,
         instr(s_element,',',1,iter.pos+1)-
         instr(s_element,',',1,iter.pos)),',')) s_element,iter.pos
from 
     (select ','||s_in||',' s_element from dual) csv,
     (select rownum pos from ra_customer_trx_all) iter
where 
     iter.pos <= ((length(csv.s_element)-length(replace(csv.s_element,',')))/length(','))-1 

где  s_in  - исходная строка

1 комментарий: