给定这个伪代码
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
语句的示例只做变量赋值(而不是执行子句)(例如 here 和 here 和 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')
另外,给变量加上一些前缀是个好主意,这样它们就不会与列名混淆。
关于sql - 可选的 where 子句取决于函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38284216/