【问题标题】:Optional where clause dependent on function argument取决于函数参数的可选 where 子句
【发布时间】:2016-11-12 01:25:09
【问题描述】:

给定这个伪代码

create or replace procedure my_test
( arg1 IN varchar2 )
begin

  select var1, var2, var3 from table1

  where 
    var1 in (select var1 from table2)

  if(arg1 = 'some_val')
    and
    var2 < 100
  end if;
end;

现在,我知道 where 子句中不允许使用 if 语句,并且我见过的所有 case 语句示例仅执行变量赋值(而不是执行子句)(例如 @987654321 @ 和 herehere)。

是否可以使用case 过滤有条件地依赖于参数函数的 where 子句,或者是使用动态 SQL 的唯一方法?

【问题讨论】:

    标签: sql oracle select plsql where


    【解决方案1】:

    您可以轻松地将伪代码转换为 SQL 逻辑:

    select var1, var2, var3
    from table1
    where var1 in (select var1 from table2) and
          ((arg1 = 'some_val' and var2 < 100) or
           (arg1 <> 'some_val')
          );
    

    注意:您需要小心NULL 值。

    而且,这可以简化为:

    where var1 in (select var1 from table2) and
          (var2 < 100 or arg1 <> 'some_val')
    

    另外,给变量加上前缀是个好主意,这样它们就不会与列名混淆。

    【讨论】:

    • 谢谢!我试图弄清楚那里的逻辑......在第一个 sn-p 中,我认为删除 arg1&lt;&gt; 'some_val' 是不安全的,因为第二个子句必须有一些东西对于要执行的整个 where 子句返回 true ?
    【解决方案2】:

    您似乎应该能够仅使用 andor 条件来执行此操作。

    where var1 in (select var1 from table2)
      and ((arg1 = 'some_val' and var2 < 100) or
           arg1 != 'some_val')
    

    当然,一个程序不能像这样只做一个赤裸裸的select。您需要将结果存储在某处,打开sys_refcursor 等。

    【讨论】:

    • 我实际上在我的代码中返回了一个sys_refcursor - 我只是想要一个最小的例子!
    【解决方案3】:

    您可以使用逻辑 or 运算符模拟此行为:

    SELECT var1, var2, var3
    FROM   table1
    WHERE  var1 IN (SELECT var1 FROM table2) AND
           (arg1 != 'some_val' OR var2 < 100)
    

    【讨论】:

      猜你喜欢
      • 2015-10-10
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多