我有以下PostgreSQL查询。

SELECT id FROM table WHERE user_id=$user_id ORDER BY
    CASE
      WHEN (date_completed_utc='0000-00-00 00:00:00') THEN 0 ELSE 1 END ASC

下面是表中内容的示例:
php - 如何按优先级和日期排序?-LMLPHP
请求的日期utc总是过去的日期。
“完成日期”utc默认为“0000-00-00 00 00:00:00”,但随后更改为比“请求日期”utc新的日期。
我要做的是:
如果默认为date_completed_utc,则所有这些行将高于所有其他行,但这些行按请求的日期_utc降序排序。
但如果date_completed_utc不是默认值,则将这些行放在底部,并按date_completed_utc降序排列这些行。
按ID排序的结果应如下所示:
26, 20, 18, 17, 15, 16, 27, 28

我试过所有这些不同的案例陈述,但似乎都不正确。

最佳答案

你可以试着用双重命令。

SELECT id
FROM table
WHERE user_id=$user_id
ORDER BY
    CASE WHEN (date_completed_utc='0000-00-00 00:00:00') THEN 0 ELSE 1 END,
    date_requested_utc DESC

编辑
我看到你的编辑问题了。
您不必使用UNION ALL组合两个查询,您可以直接使用CASE WHEN表达式查询一个。
Order by号码
1/(EXTRACT(epoch from age(now(),date_requested_utc)) / 86400date_requested_utc时间越近,数字越大。
1/(EXTRACT(epoch from age(now(),date_completed_utc::timestamp)) / 86400)::numericdate_completed_utc时间越近,数字越大。
你可以试试这个。
SELECT id
SELECT id FROM table
WHERE user_id=$user_id
ORDER BY
    (
      CASE WHEN (date_completed_utc='0000-00-00 00:00:00')
        THEN (EXTRACT(epoch from age(now(),'1970-01-01')) / 86400) + 1/(EXTRACT(epoch from age(now(),date_requested_utc)) / 86400)::numeric
        ELSE  1/(EXTRACT(epoch from age(now(),date_completed_utc::timestamp)) / 86400)::numeric
      END
    )::numeric
    DESC

sqlfiddle:http://sqlfiddle.com/#!17/f5f88a/28

09-10 10:23
查看更多