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

标签 sql oracle select plsql where-clause

给定这个伪代码

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 语句的示例只做变量赋值(而不是执行子句)(例如 hereherehere )。

是否可以使用 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/

相关文章:

SQL选择步骤

sql - 返回没有匹配项的行

sql - 多行合并为单行并合并列 SQL

python - 使用带有 IN 语句的 cx_Oracle (Python 3)

sql - 左连接多个表到一个表

sql - 我可以在 ODI 中的源变量中调用全局变量吗?

mysql - 为什么加入子查询这么慢?

sql - 使用eclipse数据工具多条sql语句(全部执行)

c - 如果用户输入某些内容,则在语句之间切换 : infinitely and with a timeout

html - 如何自定义设计选择选项卡?