使用SQL

时间:2016-06-02 08:00:03

标签: sql postgresql sorting

让我们想象一下,我有下表:

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都存在问题。

1 个答案:

答案 0 :(得分:1)

稍微不同的方法,使用NULL进行排序,而不是在遥远的过去或将来使用日期。

showScreen