如何在pl / sql游标中生成动态where条件

时间:2019-09-26 07:16:53

标签: sql oracle plsql

根据输入值在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 )

2 个答案:

答案 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,则这是另一种情况)

干杯!