可选的where子句依赖于函数参数

时间:2016-07-09 17:05:54

标签: sql oracle select plsql where

鉴于此伪代码

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语句的所有示例我只看到变量赋值(而不是执行一个条款)(例如hereherehere)。

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

3 个答案:

答案 0 :(得分:5)

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

var db = getDB('test');

注意:您需要注意.directive('numberToString', function () { return { require: 'ngModel', link: function (scope, element, attrs, ngModel) { ngModel.$parsers.push(function (value) { return '' + value; }); ngModel.$formatters.push(function (value) { return value+''; }); } } }); 值。

而且,这可以简化为:

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

另外,最好在变量前加上一些东西,这样它们就不会与列名混淆。

答案 1 :(得分:1)

您似乎只能在andor条件下执行此操作。

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

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

答案 2 :(得分:1)

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

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