PostgreSQL 按日期过滤条目,但包括未包含日期为空的条目

Posted

技术标签:

【中文标题】PostgreSQL 按日期过滤条目,但包括未包含日期为空的条目【英文标题】:PostgreSQL filter entries by date but include missed ones with null date 【发布时间】:2018-09-06 16:34:32 【问题描述】:

假设我有一个简单的表格,例如:

CREATE TABLE public.test
(
    id integer NOT NULL,
    d date NOT NULL
)

有数据:

insert into test values(1, '2018-09-05'::date);
insert into test values(2, '2018-08-05'::date);
insert into test values(2, '2018-07-05'::date);

对于不符合日期过滤器的记录,我如何以最简单的方式获取两个日期为 null 的条目? 例如

select id, d from
test where d > '2018-09-01'
union
select id, d from test;

给予:

 2  "2018-07-05"
 2  "2018-08-05"
 1  "2018-09-05"

我想:

2   "null"
1   "2018-09-05"

不能在联合中使用 distinct,这并不是说它会有所帮助。 我也许应该把这张桌子加入到自己身上并做点什么,但我不确定是什么。

【问题讨论】:

不确定我是否理解您的预期结果。为什么那里有一个 id 为 2 的 NULL? 【参考方案1】:

如果我理解正确,您可以将条件移至您的选择:

SELECT 
    DISTINCT
    id, 
    (case when d > '2018-09-01' then d end) as d 
FROM 
    test 

【讨论】:

看起来不错,但我会改用(case when d > '2018-09-01'::date then d else null end) as d。所以PostgreSQL比较真实的日期类型而不是日期类型和字符串类型 这个演员应该是自动的。但我同意。【参考方案2】:

我的解决方案:

select distinct 
  t.id,
  (select max(t_max.d) from test t_max where t_max.id = t.id and t_max.d > '2018-09-01')
from test t;

你可以测试一下here。

【讨论】:

以上是关于PostgreSQL 按日期过滤条目,但包括未包含日期为空的条目的主要内容,如果未能解决你的问题,请参考以下文章

日期和按日期排序时的postgresql案例

在 CodeIgniter 中按日期过滤 MySQL 条目

在大型数据集(~3M 条目)上使用 PostgreSQL 进行特征工程

PostgreSQL 在按日期索引的时间戳字段上按日期搜索性能不佳

按核心数据中的日期组件获取条目

使用两个未绑定的文本框按日期范围过滤表单记录