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 列信息时出现存储过程错误

构建一些动态查询选择并立即在 Oracle PL/SQL 中显示其输出

pl sql & java - 创建动态查询

PL/SQL ORACLE 查询作为结果

Oracle PL/SQL查询结果如何自动换行

向我介绍 Oracle PL/SQL 扩展