让我们想象一下,我有下表:
CREATE TABLE tbla (id SERIAL, curr DATE, active BOOLEAN);
" tbla":
中有记录 INSERT INTO tbla(curr,active)
VALUES
(DATE '2016-05-20', TRUE),
(DATE '2016-05-26', FALSE),
(DATE '2016-04-11', TRUE)
(DATE '2016-06-15', TRUE),
(DATE '2016-07-01', FALSE),
(DATE '2016-04-01', FALSE),
(DATE '2016-08-07', TRUE);
它的任务列表," curr"是截止日期。我想在结果列表中仅查看当前时间的实际任务(curr> now()),以及列表末尾的已完成任务,但按时间顺序排序。 "有源"列意味着" TRUE"任务完成成功,否则" FALSE"然后任务失败完成。我不在乎"活跃"在实际任务中(curr> now()),但在完成的任务中,我想看到只有完成成功的任务。
我为它编写了以下查询(NOW()
是DATE '2016-06-02'
):
SELECT *
FROM tbla
ORDER BY
CASE
WHEN curr < NOW() THEN
DATE '3000-01-01'
ELSE curr
END,
CASE
WHEN active = FALSE THEN
DATE '1970-01-01'
ELSE curr
END DESC,
curr DESC;
我得到了正确答案:
4 | 2016-06-15 | TRUE
5 | 2016-07-01 | FALSE
6 | 2016-08-07 | TRUE
1 | 2016-05-20 | TRUE
3 | 2016-04-11 | TRUE
2 | 2016-05-26 | FALSE
7 | 2016-04-01 | FALSE
我想指出,结果由三部分组成,第一部分是实际任务排序&#34; curr&#34;在asc:
4 | 2016-06-15 | TRUE
5 | 2016-07-01 | FALSE
6 | 2016-08-07 | TRUE
然后第二个是成功完成的任务:
1 | 2016-05-20 | TRUE
3 | 2016-04-11 | TRUE
最后一部分包括失败的任务:
2 | 2016-05-26 | FALSE
7 | 2016-04-01 | FALSE
我很有兴趣看到,你如何解决任务,我在上面描述过。 你可以解决不同的问题吗?
P.S。我使用的是PostgreSQL 9.4,但我认为所有RDBMS都存在问题。
答案 0 :(得分:1)
稍微不同的方法,使用NULL进行排序,而不是在遥远的过去或将来使用日期。
showScreen