我有以下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
以下是表格中的内容示例:
date_requested_utc 始终是过去的日期。
date_completed_utc 默认为'0000-00-00 00:00:00',但稍后更改为比 date_requested_utc 更新的日期。
我想要完成的是:
如果 date_completed_utc 是默认值,那么所有这些行都将高于其他所有行,但这些行按 date_requested_utc 降序排序。
但如果 date_completed_utc 不是默认值,则将这些行放在底部,并按 date_completed_utc 降序排序这些行。
按ID生成的订单应如下所示:
26, 20, 18, 17, 15, 16, 27, 28
我已经尝试了所有这些不同的CASE陈述,但似乎无法做到正确。
答案 0 :(得分:2)
您可以尝试使用双重订单。
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)) / 86400
date_requested_utc
越接近时间就越大。1/(EXTRACT(epoch from age(now(),date_completed_utc::timestamp)) / 86400)::numeric
date_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
答案 1 :(得分:0)
(代表作者提问回答)。
我将查询更改为以下内容,现在工作正常。
(SELECT id FROM table WHERE user_id=$user_id AND date_completed_utc='0000-00-00 00:00:00' ORDER BY date_requested_utc DESC)
UNION ALL
(SELECT id FROM table WHERE user_id=$user_id AND date_completed_utc!='0000-00-00 00:00:00' ORDER BY date_completed_utc DESC)