Ковырялся в коде старого приложения на предмет его анализа и наткнулся на "мощный алгорим", формирующий результирующий набор строк из строки с разделителями, например из такой: "1,2,3,4,5,6,7,8,9,10,a,b,c,d,e,f":
with src as (SELECT ','||'1,2,3,4,5,6,7,8,9,10,a,b,c,d,e,f'||',' str from dual)
select
level lvl,
trim(substr(Src.Str,instr(Src.Str,',',1,level)+1 chunk,
instr (Src.Str,',',1,level+1)-instr(Src.Str,',',1,level)-1)) op_num
from
src
connect by
rownum<=(length(Src.Str)-length(replace(Src.Str,',')))-1
Код, конечно, работает, но:
1. В этом коде реально неудобно разбираться
2. Этот код не учитывает наличие пробелов или каких-либо "лишних символов" между разделителями, а по идее - должен
Варианты альтернативного исполнения:
1. Конвейерная (pipelined) функция
2. Функция, возвращающая массив
3. Regexp'ы (пример есть у меня в разделе "Сравнение строк по сигнатурам".
PS. Я бы вот так вот написал:
PS. Я бы вот так вот написал:
with params as (select '\s*([^,]+)\s*(,|$)' pattern,'1,2,3,4,5,6,7, 8, 9 ,10,,12, a, bb, ccc , dddd' string from dual)
select
regexp_substr(params.string, params.pattern, 1, level, 'i',1) chunk
from
params
connect by
regexp_substr(params.string, params.pattern, 1, level, 'i',1) is not null
Комментариев нет:
Отправить комментарий