根据输入值在pl / sql游标中生成动态where条件
例如:
输入值:a b c值
查询格式:
CREATE OR REPLACE Procedure abcprocedure
( a IN Number,b IN Number, c IN Number )
cursor abccursor
IS
select 1
from pqr p
where ( Prepare the where condition based on a,b,c values and null checks also )
答案 0 :(得分:2)
这就是我对问题的理解;不需要 dynamic 东西。
对于更简单的测试(对我而言,因为我没有您的表),可以在Scott的DEPT
表上执行此操作(par_x
是过程参数的名称)。
select *
from dept
where deptno in (par_a, par_b, par_c)
or (par_a is null and par_b is null and par_c is null);
如果这些是不同的列,也没有问题:
select *
from dept
where (deptno = par_a or par_a is null)
and (dname = par_b or par_b is null)
and (loc = par_c or par_c is null);
如果未传递某些参数,并且您不想看到该列的值,请使用
select case when par_a is not null then deptno
else null
end deptno,
--
case when par_b is not null then dname
else null
end dname,
--
case when par_c is not null then loc
else null
end loc
from dept
where (deptno = par_a or par_a is null)
and (dname = par_b or par_b is null)
and (loc = par_c or par_c is null);
如果您想从结果集中排除该列,那并不是那么简单。如果使用(例如)Oracle Apex,则可以选择不渲染该列。否则,在纯SQL中,我将不知道该怎么做。
答案 1 :(得分:2)
根据您的评论,我建议在以下情况下使用coalesce
:
SELECT *
FROM PQR P
WHERE COALESCE(A, DEPT1) = DEPT1
AND COALESCE(B, DEPT2) = DEPT2
AND COALESCE(C, DEPT3) = DEPT3;
Coalesce
如果不为null,则将采用传递的参数。这样就可以达到预期的效果。如果a为null,则dept1 = dept1
将始终为true(如果表中的dept1不为null,则这是另一种情况)
干杯!