可选的 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')
另外,给变量加上前缀是个好主意,这样它们就不会与列名混淆。
看来你应该能够在 and
和 or
条件下做到这一点。
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)
给出这个伪代码
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')
另外,给变量加上前缀是个好主意,这样它们就不会与列名混淆。
看来你应该能够在 and
和 or
条件下做到这一点。
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)