繁体   English   中英

根据列有条件地应用日期过滤器 - Oracle SQL

[英]Conditionally apply date filter based on column - Oracle SQL

我有一个看起来像这样的表:

| Type |  DueDate  |
|:----:|:---------:|
|   A  |  1/1/2019 |
|   B  |  2/3/2019 |
|   C  |    NULL   |
|   A  |  1/3/2019 |
|   B  |  9/1/2019 |
|   C  |    NULL   |
|   A  |  3/3/2019 |
|   B  |  4/3/2019 |
|   C  |    NULL   |
|   B  |  1/6/2019 |
|   A  | 1/19/2019 |
|   B  |  8/1/2019 |
|   C  |    NULL   |

我需要完成的是:

抓取所有类型为 C 的行。 对于任何其他类型,只有在 2019 年 5 月 1 日之后的截止日期才能获取它们。

这是一个虚拟数据——实际上,有 10 或 15 种类型和大约 125M 左右的行。

我试过SELECT * FROM tblTest WHERE ((Type IN ('A', 'B') AND DueDate > '05-01-2019') OR Type = 'C')但这正是上面的表格。

只需更改WHERE DUEDATE >= '05/01/2019' filters out NULL`

如何编辑我的WHERE语句以实现以下预期结果?

| Type |  DueDate |
|:----:|:--------:|
|   C  |   NULL   |
|   B  | 9/1/2019 |
|   C  |   NULL   |
|   C  |   NULL   |
|   B  | 8/1/2019 |
|   C  |   NULL   |

SQL FIDDLE供参考

如果您的日期使用正确的类型存储,您只需执行以下操作:

select t.*
from tbltest
where duedate > date '2019-05-01' or type = 'C';

我建议您修复duedate列以具有正确的类型。 在解决此问题之前,您可以解决此问题:

select t.*
from tbltest
where to_date(duedate, 'MM/DD/YYYY') > date '2019-05-01' or type = 'C';

根据戈登的回答,您需要在or条件下使用它。

如果您在where clause中除了所提及的内容之外还有更多条件,则需要对条件进行分组。

select *
from tbltest
where (duedate > DATE '2019-05-01' 
      or type = 'C') -- group these condition using brackets
And other_condition;

实际上,您的原始查询具有or条件与所有其他条件不带任何括号,并且会产生结果中的所有行。

干杯!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM