PostgreSQL 按日期过滤条目,但包括日期为空的遗漏条目
PostgreSQL filter entries by date but include missed ones with null date
假设我有一个简单的 table 例如:
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,但这不会有帮助。
我也许应该加入这个 table 并做一些事情,但我不确定是什么。
如果我理解正确,你可以将条件移动到你的 select:
SELECT
DISTINCT
id,
(case when d > '2018-09-01' then d end) as d
FROM
test
我的解决方案:
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。
假设我有一个简单的 table 例如:
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,但这不会有帮助。 我也许应该加入这个 table 并做一些事情,但我不确定是什么。
如果我理解正确,你可以将条件移动到你的 select:
SELECT
DISTINCT
id,
(case when d > '2018-09-01' then d end) as d
FROM
test
我的解决方案:
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。