oracle 如何编写SQL where子句

hmae6n7t  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(103)

我已经简化了一个请求的SQL报告。其中一个参数是允许他们输入他们希望数据/行返回多少天,例如。他们输入10天,但如果他们什么都不输入,目前它会获取过去90天的所有内容。
他回来询问是否有一种方法可以在没有提供值的情况下获取所有数据(目前它只获取最近90天的数据)
我只试过nvl到目前为止-

Select * 
From timesheets
Where transaction_date between trunc(sysdate-nvl('&Days','90')) and trunc(sysdate)
oxcyiej7

oxcyiej71#

像这样吗

select * from timesheets
where transaction_date >= trunc(sysdate) - :par_days
   or :par_days is null;

示例(SQL * Plus,使用替换变量):

SQL> with timesheets (id, transaction_date) as
  2    (select 1, date '1990-02-18' from dual union all
  3     select 2, date '2022-08-15' from dual union all
  4     select 3, date '2023-07-22' from dual union all
  5     select 4, date '2023-09-07' from dual
  6    )
  7  select *
  8  from timesheets
  9  where transaction_date >= trunc(sysdate) - '&&par_days'
 10     or '&&par_days' is null;
Enter value for par_days:

        ID TRANSACTIO      --> par_days is NULL - all rows are returned
---------- ----------
         1 18.02.1990
         2 15.08.2022
         3 22.07.2023
         4 07.09.2023

SQL> undefine par_days
SQL> /
Enter value for par_days: 30

        ID TRANSACTIO     --> rows within last 30 days
---------- ----------
         4 07.09.2023

SQL>
2q5ifsrm

2q5ifsrm2#

您可以用途:

SELECT *
FROM   timesheets
WHERE  transaction_date < TRUNC(SYSDATE) + INTERVAL '1' DAY
AND    ('&Days' IS NULL OR transaction_date >= TRUNC(SYSDATE) - INTERVAL '&&Days' DAY)

或:

SELECT *
FROM   timesheets
WHERE  transaction_date < TRUNC(SYSDATE) + 1
AND    (:Days IS NULL OR transaction_date >= TRUNC(SYSDATE) - :Days)
  • 注意:如果你的上限为transaction_date <= TRUNC(SYSDATE),那么你会得到今天午夜之前或等于午夜的所有数据,并排除今天午夜之后1秒的所有行。如果你使用transaction_date < TRUNC(SYSDATE) + 1,那么你得到的是今天任何时间之前或等于今天任何时间的所有值。如果你的DATE列只包含有午夜时间成分的值,那么两者的行为都是一样的,但是如果你有非午夜时间成分,那么你需要检查你想要实现的业务逻辑(可能是今天的任何时候,而不仅仅是午夜)。

相关问题