PostgreSQL 按两列排序,最后可为空

PostgreSQL order by two columns with nullable last

我有 table:

id date bonus
1 2022-03-10 16:11:06.445559 6000
2 2022-03-15 16:11:06.445559 4000
3 2022-03-20 16:11:06.445559 null
4 2022-03-25 16:11:06.445559 7000
5 2022-03-30 16:11:06.445559 null

我需要使用 PostgreSQL 语法按日期和奖励列对行进行排序。首先应该是最新的(按日期排序)具有不可为空的奖金的行。然后应该是按日期排序的可空奖金行(也是最新的) 结果应该是下一个:

id date bonus
4 2022-03-25 16:11:06.445559 7000
2 2022-03-15 16:11:06.445559 4000
1 2022-03-10 16:11:06.445559 6000
5 2022-03-30 16:11:06.445559 null
3 2022-03-20 16:11:06.445559 null
SELECT * 
FROM table
ORDER BY
    bonus IS NULL ASC,
    date DESC;

bonus IS NULL 是一个布尔值,您可以按它排序。在我看来,它比 CASE

更简洁(至少更短)

你可以用条件for bonus,优先级高,然后降序排序date作为较低的优先级,例如

ORDER BY CASE WHEN bonus IS NULL THEN 1 ELSE 0 END, date DESC

Demo