可选的 where 子句取决于函数参数

Optional where clause dependent on function argument

给出这个伪代码

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;

现在,我知道 if 语句在 where 子句中是不允许的,而且我见过的所有 case 语句的例子都只做变量赋值(而不是执行子句)(例如 here and here and here)。

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

您可以轻松地将伪代码转换为 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')

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

看来你应该能够在 andor 条件下做到这一点。

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

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

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

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