Я сделал это, используя вложенную таблицу SQL и конвейерную функцию, чтобы предоставить третий вариант.
Сначала создайте тип SQL и связанную вложенную таблицу:
create or replace type range_type as object (range_from number, range_to number);
create or replace type range_table as table of range_type;
Затем создайте конвейерную функцию, которая может декодировать столбец диапазона.Эта функция, вероятно, может быть легко переписана для использования функции apex_util.string_to_table, использованной выше.
create or replace function range_to_nested_table(i_ranges in varchar2)
return range_table pipelined is
thisRange varchar2(4000);
loop_counter number := 1;
output_row range_type;
begin
loop
thisRange := rtrim(regexp_substr(i_ranges, '[^,]*,?', 1, loop_counter), ',');
exit when thisRange is null;
loop_counter := loop_counter + 1;
if thisRange like '%-%' then
output_row := range_type(to_number(regexp_substr(thisRange, '[^-]*', 1, 1)),
to_number(regexp_substr(thisRange, '[^-]*(-|$)', 1, 2)));
else
output_row := range_type(to_number(thisRange), to_number(thisRange));
end if;
pipe row(output_row);
end loop;
RETURN;
end;
Затем выполните следующий запрос для получения данных:
with my_sample_data as (
select 1 as id, 'Blue' as color, '1-9,23.5-25.1,27.11,99.14' as range from dual union all
select 2 as id, 'Red' as color, '4' as range from dual union all
select 3 as id, 'Green' as color, '4.44-5.3' as range from dual union all
select 4 as id, 'Black' as color, '18-22,101' as range from dual
)
select id, color, range, b.*
from my_sample_data a, table(range_to_nested_table(a.range)) b
where 5 between b.range_from and b.range_to