Oracle PL/SQL:创建短路查询
Posted
技术标签:
【中文标题】Oracle PL/SQL:创建短路查询【英文标题】:Oracle PL/SQL: Create a short circuit query 【发布时间】:2019-11-19 15:54:53 【问题描述】:我有点老派,所以我称之为短路。
但我在 Oracle 中有 3 个表。我还有一个“ProcessFlag”。如果表中的任何数据符合我的条件,我想设置 procesdFlag = 1。
我显然可以使用 if 和 else 语句来做到这一点。
select count(*) into myCounter from from Table1 where processflag = 1;
if myCounter = 0 then
select count(*) into myCounter from Table2 where processflag = 1;
if myCounter = 0 then
select count(*) into myCounter from Table3 where processflag = 1;
if myCounter = 0 then
processFlag = 0;
else
processFlag = 1;
end if
else
processFlag = 1;
end if
else
processFlag = 1;
end if
所以,假设我的所有 if/eles 都是正确的,我想你明白我想要做什么了。如果任何表中有任何行的 processFlag = 1,那么我要处理。
这只是一个演示的小例子,但我的现实世界有大约 10 个表,如果不需要的话,我真的不想将 if/else 语句嵌套得那么深。而且这些表有的数据很多,所以如果第1个表查到东西,就不用再去查后续表了(这也是为什么我叫它短路,因为一查到东西,就没有需要处理剩余的代码)。
如果在 Oracle 中有更清洁/高效的方法来做到这一点?
【问题讨论】:
【参考方案1】:您可以使用case when
进行短路查询,如下::
Select case
when (select 1 from table1 where processflag = 1 and rownum =1) = 1 -- small table in terms of number of rows
then 1
when (select 1 from table2 where processflag = 1 and rownum =1) = 1 -- larger than table1 table in terms of number of rows and so on
then 1
..
Else 0 end into processFlag
From dual;
Case when
将在找到一个匹配项后停止执行该语句。
您也可以在case when
语句中给出表的顺序以获得更好的性能,在when
子句中首先使用小表并在末尾使用大表以获得良好的性能。
干杯!!
【讨论】:
完美!这样可行。它看起来比我拥有的要干净得多。而且,如果第 8 或第 9 个查询有很多行,它也不会评估它!【参考方案2】:你想要这样的东西吗?
select . . .
from . . .
where exists (select 1 from table1 where processflag = 1) or
exists (select 1 from table2 where processflag = 1) or
exists (select 1 from table3 where processflag = 1) ;
也就是说,您可以根据一堆exists
条件进行查询。如果你使用 PL/SQL,你可以使用类似的东西来实际设置一个标志。
【讨论】:
【参考方案3】:你可以使用rownum:
select count(*) into myCounter
from (
select * from Table1 where processflag = 1
) l where rownum = 1;
【讨论】:
以上是关于Oracle PL/SQL:创建短路查询的主要内容,如果未能解决你的问题,请参考以下文章
ORACLE PL/SQL 在查询 3 列信息时出现存储过程错误