在where子句中为参数使用NVL

时间:2018-10-15 16:43:00

标签: sql oracle bi-publisher nvl

现在我有以下查询:

select INVOICE_ID, INVOICE_NUM, VENDOR_NUM, STATUS, GROUP_ID
from AP_INVOICES_INTERFACE 
and status in(:p_status)
and last_update_date between :p_date_from and :p_date_to
order by last_update_date, group_id

但这仅显示状态为“已拒绝”还是“已处理”。我需要它,以便它也可以显示状态为null的时间。我将如何包含NVL来显示此内容?

不确定此信息是否相关,但是“状态”的值列表中的查询为

SELECT DISTINCT STATUS 
FROM AP_INVOICES_INTERFACE

3 个答案:

答案 0 :(得分:0)

尝试一下:

select INVOICE_ID, 
       INVOICE_NUM, 
       VENDOR_NUM, 
       STATUS, 
       GROUP_ID
  from AP_INVOICES_INTERFACE 
 where (status in (:p_status) OR status is null)
   and last_update_date between :p_date_from and :p_date_to
 order by last_update_date, 
          group_id

您需要关闭状态验证的范围才能正确使用“ OR”

答案 1 :(得分:0)

看起来NVL不是您所需要的。

尝试这样的事情:

select INVOICE_ID, INVOICE_NUM, VENDOR_NUM, STATUS, GROUP_ID
from AP_INVOICES_INTERFACE 
where last_update_date between :p_date_from and :p_date_to 
and (status is null or status in(:p_status))
order by last_update_date, group_id;

答案 2 :(得分:0)

如果您还需要nvl来捕捉status = null何时被“拒绝”或“处理”,您可以尝试以下方法:

...
where nvl(status,'processed') in (:p_status)
  and ...

这样,如果statusnull,则nvl会将其值转换为'process',并为该条件返回true