假设您对创建几个附加对象(集合类型和函数)没有任何限制,您可以将列表解析为可以在查询中引用的集合。Tom Kyte 在他的变量“IN”列表线程中对此进行了很好的讨论。
例如,如果您使用 Tom's myTableType
andin_list
函数
SQL> create or replace type myTableType as table
of varchar2 (255);
2 /
Type created.
ops$tkyte@dev8i> create or replace
function in_list( p_string in varchar2 ) return myTableType
2 as
3 l_string long default p_string || ',';
4 l_data myTableType := myTableType();
5 n number;
6 begin
7 loop
8 exit when l_string is null;
9 n := instr( l_string, ',' );
10 l_data.extend;
11 l_data(l_data.count) :=
ltrim( rtrim( substr( l_string, 1, n-1 ) ) );
12 l_string := substr( l_string, n+1 );
13 end loop;
14
15 return l_data;
16 end;
17 /
然后您可以相对容易地搜索相等性。
WHERE product_group IN (SELECT column_value
FROM TABLE( in_list( strProductGroup )))
但是你想做LIKE
一个更具挑战性的事情,因为你不能LIKE
在列表中做一个。但是,您可以执行类似的操作
select *
from emp e,
(select '^' || column_value search_regexp
from table( in_list( 'KIN,BOB' ))) a
where regexp_like( e.ename, a.search_regexp )
这将在表中搜索以或开头EMP
的任何员工。在默认表中,这将只返回一行,即“KING”所在的行ENAME
KIN
BOB
SCOTT.EMP
ENAME