你可以像这样创建一个PL / SQL函数:
function value_included (p_value in number, p_ranges in varchar2)
return number
is
l_ranges_tab apex_application_global.vc_arr2;
l_values_tab apex_application_global.vc_arr2;
l_retval number := 0;
begin
l_ranges_tab := apex_util.string_to_table (p_ranges, ',');
for i in 1..l_ranges_tab.count loop
l_values_tab := apex_util.string_to_table (l_ranges_tab(i), '-');
if l_values_tab.count = 1 then
if p_value = l_values_tab(1) then
l_retval := 1;
exit;
end if;
else
if p_value between l_values_tab(1) and l_values_tab(2) then
l_retval := 1;
exit;
end if;
end if;
end loop;
return l_retval;
end;
如果值包含在范围内,则返回1,否则返回0,可以像这样使用:
select color from colors where value_included(5, ranges);
可以编写类似的函数来处理重叠范围:
function range_overlap (p_from in number, p_to in number, p_ranges in varchar2)
return number
is
l_ranges_tab apex_application_global.vc_arr2;
l_values_tab apex_application_global.vc_arr2;
l_retval number := 0;
begin
l_ranges_tab := apex_util.string_to_table (p_ranges, ',');
for i in 1..l_ranges_tab.count loop
l_values_tab := apex_util.string_to_table (l_ranges_tab(i), '-');
if l_values_tab.count = 1 then
if l_values_tab(1) between p_from and p_to then
l_retval := 1;
exit;
end if;
else
if p_to >= l_values_tab(1) and p_from <= l_values_tab(2) then
l_retval := 1;
exit;
end if;
end if;
end loop;
return l_retval;
end;
注意:apex_util.string_to_table函数在最新版本的Oracle中作为标准提供;在早期版本中,您可能需要编写自己的字符串解析器函数,就像这样