[英]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.