Coalesce语句处理多个值和NULLS?

时间:2017-06-23 20:51:47

标签: oracle oracle11g business-intelligence bi-publisher

我想弄清楚如何创建一个SQL查询来检查(:FROM_DATE)和(:TO_DATE)参数,如果NULL将过去的月份日期放入这两个值,如果不是NULL则接受在参数中输入的任何值。

例如:

  • 如果用户输入(01-JAN-17FROM_DATE,(31-JAN-17)为TO_DATE,我希望查询不会自动传递任何值TO_DATEFROM_DATE

  • 如果用户未输入TO_DATEFROM_DATE的任何值,或者传入了NULL个值,我希望查询自动输入过去几个月的值(即,如果查询在2017年7月1日运行,则FROM_DATE将为01-JUN-17TO_DATE将为30-JUN-17)。

我被暗示使用coalesce语句来处理多个值NULLS(即AND ( (coalesce(null, :P_ORG) is null) or (ORG.ORGANIZATION_ID in :P_ORG))) ???

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

类似的东西:

SELECT *
FROM   your_table
WHERE  your_date_column BETWEEN TO_DATE( :from_date, 'DD-MON-YYYY' )
                        AND     TO_DATE( :to_date, 'DD-MON-YYYY' )
OR     (   ( :from_date IS NULL OR :to_date IS NULL )
       AND your_date_column BETWEEN ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -1 )
                            AND     TRUNC( SYSDATE, 'MM' ) - 1
       );

如果:from_date:to_date中的任何一个(或两者)都是NULL,则日期将与上个月进行比较。

如果您的表格中的日期时间组件并不总是设置为午夜,那么您需要使用:

SELECT *
FROM   your_table
WHERE  your_date_column BETWEEN TO_DATE( :from_date, 'DD-MON-YYYY' )
                        AND     TO_DATE( :to_date, 'DD-MON-YYYY' )
OR     (   ( :from_date IS NULL OR :to_date IS NULL )
       AND your_date_column >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -1 )
       AND your_date_column <  TRUNC( SYSDATE, 'MM' )
       );

答案 1 :(得分:0)

概念验证:请考虑以下查询,其中包含日期和值,并且我们希望对:from_date:to_date之间的日期值进行求和。如果其中任何一个为null,则查询将使用前一个月的第一天from_date和前一个月的最后一天to_date。请注意,如果一个日期被赋予实际值而另一个日期被保留null,这将导致问题 - 您没有解释您希望如何处理。但这是一个不同的问题。

我使用SQL开发人员,在其中我不知道如何传递日期;我在字符串中显示传递,并将它们转换为日期。

with
     test_data ( dt, val ) as (
       select date '2017-05-29', 200 from dual union all
       select date '2017-06-13', 150 from dual union all
       select date '2017-06-18', 500 from dual
     )
select sum(val) as sum_val
from   test_data
where  dt between coalesce(to_date(:from_date, 'yyyy-mm-dd'), 
                                                   add_months(trunc(sysdate, 'mm'), -1))
              and coalesce(to_date(:to_date  , 'yyyy-mm-dd'), trunc(sysdate, 'mm') - 1)
;

答案 2 :(得分:0)

是的,您可以使用COALESCE(或Oracle NVL)。当参数为null时,将其替换为默认日期。

select *
from mytable
where mydate >= coalesce(:from_date, trunc(sysdate - interval '1' month), 'month')
  and mydate <= coalesce(:to_date, last_day(sysdate - interval '1' month));