游标 where 子句中的可选参数
Posted
技术标签:
【中文标题】游标 where 子句中的可选参数【英文标题】:Optional parameters in cursor where clause 【发布时间】:2020-06-01 18:01:34 【问题描述】:我有以下示例查询,它从过程参数中获取值。该参数可以被传递或默认为空。
SELECT * FROM table
WHERE( table_term_code = '201931'
OR (table_term_code = '201931' and table_DETL_CODE ='CA02')
OR ( table_term_code = '201931' and table_ACTIVITY_DATE = sysdate)
OR ( table_term_code = '201931' and table_SEQNO = NULL));
即用户可以输入术语代码而不输入任何其他参数,或者可以输入术语代码和table_DETL_CODE而不输入任何其他输入参数。
其他两个条件也一样。
如果传递了术语代码并且 table_DETL_CODE 为 null,则查询应返回该 term_code 的所有值,而此查询返回 null。
有没有办法在 PL/SQL 中不使用 case 或 if 条件来实现这一点?
【问题讨论】:
Oracle 具有内置的空值处理功能。参考documentation A Abra - 我确实尝试过 NVL ,但我的问题是即使 table_DETL_CODE 不为空,那么我的查询应该过滤第二个条件,而不是 where 子句为我提供 term_code 中的所有记录。 【参考方案1】:如果我对您的理解正确,这可能就是您要找的:
select *
from your_table
where (table_term_code = :par_term_code or :par_term_code is null)
and (table_detl_code = :par_detl_code or :par_detl_code is null)
and (table_activity_date = :par_activity_date or :par_activity_date is null)
and (table_seqno = :par_seqno or :par_seqno is null)
【讨论】:
谢谢。在上面,如果我传入 term_code 的值并且不传递其余的值。它不返回记录,因为 AND 运算符查看 null 。如果用户只为第一个字段传递记录,我的查询应该返回记录。 OR 运算符将返回,但我需要为 term_code 和 NOT null detl_code 过滤记录的第二种情况将失败。【参考方案2】:您的描述似乎要求用户输入 table_term_code,然后输入其他 3 个中的任何一个或不输入一个。如果是这样,那么可能:
select *
from your_table
where table_term_code = :par_term_code
and ( (table_detl_code = :par_detl_code and :par_activity_date is null and :par_seqno is null)
or (table_activity_date = :par_activity_date and :par_detl_code is null and :par_seqno is null)
or (table_seqno = :par_seqno and :par_detl_code is null and :par_activity_date is null)
or (table_seqno is null and :par_detl_code is null and :par_activity_date is null)
);
【讨论】:
以上是关于游标 where 子句中的可选参数的主要内容,如果未能解决你的问题,请参考以下文章