游标 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 子句中的可选参数的主要内容,如果未能解决你的问题,请参考以下文章

where 条件中的可选参数 - 如何提高性能 - PL/SQL

SQLAlchemy中的可选参数

WHERE 子句中的动态可选参数

使用可选参数对 Where 子句进行续集

TypeORM queryBuilder 中的可选参数

可选的SSRS参数