Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle Coalesce语句来处理多个值和空值?_Oracle_Oracle11g_Business Intelligence_Bi Publisher - Fatal编程技术网

Oracle Coalesce语句来处理多个值和空值?

Oracle Coalesce语句来处理多个值和空值?,oracle,oracle11g,business-intelligence,bi-publisher,Oracle,Oracle11g,Business Intelligence,Bi Publisher,我试图找出如何创建一个SQL查询,该查询将检查(:FROM_DATE)和(:to_DATE)参数,如果NULL,则为这两个值输入上个月的日期,如果不是NULL,则接受在参数中输入的任何值 例如: 如果用户输入(01-JAN-17)作为FROM\u DATE,以及(31-JAN-17)作为TO\u DATE,我希望查询不会自动传递TO\u DATE和FROM\u DATE的任何值 如果用户没有为TO_DATE和FROM_DATE输入任何值,或者传入了NULL值,我希望查询自动输入过去几个月的值(

我试图找出如何创建一个SQL查询,该查询将检查(
:FROM_DATE
)和(
:to_DATE
)参数,如果
NULL
,则为这两个值输入上个月的日期,如果不是
NULL
,则接受在参数中输入的任何值

例如:

  • 如果用户输入(
    01-JAN-17
    )作为
    FROM\u DATE
    ,以及(
    31-JAN-17
    )作为
    TO\u DATE
    ,我希望查询不会自动传递
    TO\u DATE
    FROM\u DATE
    的任何值

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

我被暗示使用coalesce语句来处理多个值和
null
(即
和((coalesce(null,:p_ORG)为null)或(ORG.ORGANIZATION_ID in:p_ORG))

任何帮助都将不胜感激。

如:

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' )
       );
选择*
从你的桌子上
其中,您的“日期”列介于到之间(:from\u date,“DD-MON-YYYY”)
截止日期(:截止日期,'DD-MON-YYYY')
或((:from_date为空或:to_date为空)
并且您的_date_列>=添加_个月(TRUNC(SYSDATE,'MM'),-1)
以及您的_date_列< /代码> 概念证明:考虑下面的查询,在这里我们有日期和值,我们要对在<代码>之间的日期的值求和:从FasyDATE < /COD>和<代码>:toDeals。如果其中的任何一个都是<代码> null <代码>,则查询将使用前一个月的第一天为FasyDATE < /C> >和PRI的最后一天。请注意,如果一个日期给定了实际值,而另一个日期保持为空,则这将导致问题。您没有解释您希望如何处理该问题。但这是另一个问题

我使用SQLDeveloper,在其中我不知道如何传递日期;我展示了传递字符串,并将它们转换为日期

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)
;

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

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));
选择*
从mytable
其中mydate>=合并(:从日期开始,trunc(sysdate-间隔“1”个月),“月”)

mydate Oracle和Postgresql在处理日期和时间方面有不同的功能。您使用的是哪一个?@cachique抱歉,它是为Oracle BI Publisher提供的…所以Oracle SQL。在
范围的开始处有
:to_date
,在
范围和
:from_date
之间,在结束处它不会使用前一个月作为范围,如果e确切地说,bind变量中有一个是
NULL
-它将使用非
NULL
值和上个月的值的组合。@MT0-感谢您抓住了to/from的困惑,我在帖子中也找到了它,并修复了它,但不在代码中。我明确提到了这个问题,只有一个输入为NULL;OP没有说明他想要的行为就是这样。我只是做了一个与你不同的猜测。这非常有效!谢谢你,先生,这正是我想要的。非常感谢。