Oracle:PL / SQL中最快的方法,以查察是否存在值:List,VARRAY或
|
更新假如您想查察长原始题目,请查察编辑内容.这是题目的更简捷的短版本…… 我必要看看GroupA(不老是GroupA,这会改变每个轮回迭代)是否存在于200个阁下的组中的[list,varray,temp table,what].我怎样存储这200个组完全由我节制.但我想将它们存储在一个有助于最快“存在”搜查的结构中,由于我必需在一个轮回中针对差异的值(不老是GroupA)多次搜查此列表.那么PL / SQL最快,搜查列表…… 假如’GroupA’IN(‘GroupA’,’GroupB’)那么…… 或行使会员搜查VARRAY … IF 'GroupA' MEMBER OF myGroups THEN 或以这种方法搜查VARRAY …… FOR i IN myGroups.FIRST .. myGroups.LAST
LOOP
IF myGroups(i) = 'GroupA' THEN
v_found := TRUE;
EXIT;
END IF;
END LOOP;
或搜查关联数组…… 更新:从每小我私人的提议测试的最终功效 逗号脱离列表,譬喻:,GroupA,GroupB,GroupC,…约莫200个组…(通过循漫游标建造的列表) FOR i IN 1 .. 10000000 loop
if myGroups like '%,NONE,%' then
z:=z+1;
end if;
end loop;
--690msec
沟通的逗号脱离列表(循漫游标建造的列表)… FOR i IN 1 .. 10000000 loop
if instr(myGroups,',') > 0 then
z:=z+1;
end if;
end loop;
--818msec
varray,沟通的200组(散装网络的varray)…… FOR i IN 1 .. 10000000 loop
IF 'NONE' MEMBER of myGroups THEN
z:=z+1;
end if;
end loop;
--780msec
@Yaroslav Shabalin提议的关联数组要领(通过循漫游标建造的关联数组)… FOR i IN 1 .. 10000000 loop
if (a_values('NONE') = 1) then
z:=z+1;
end if;
end loop;
--851msec
办理要领myGroup是varray吗?假如它是一个字符串实行相同于:select 1 from dual where 'abc,def' like '%,%' 很难遵循你正在行使的束缚……假如也许的话,在sql中做统统,它会更快. 更新: 以是,假如你已经在一个plsql单位中,并但愿保存在一个plsql单位中,那么上面的逻辑将是这样的: declare
gp varchar2(200) := 'abc,def,higlmn,op';
begin
if ','||gp||',' like '%,%' then
dbms_output.put_line('y');
else
dbms_output.put_line('n');
end if;
end;
假如这个自己处于轮回中,那么将列表设为: declare
gp varchar2(200) := 'abc,op';
gp2 varchar2(200) := ',' || gp || ',';
begin
if g2 like '%,%' then
dbms_output.put_line('y');
else
dbms_output.put_line('n');
end if;
end;
也实行instr,它也许比以下更快: declare
gp varchar2(200) := ',abc,hig,';
begin
if instr(gp,') > 0 then
dbms_output.put_line('y');
else
dbms_output.put_line('n');
end if;
end;
我不知道这是否比其他提到的办理方案更快(这是一个很好的机遇),这是另一回事. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

