带有表达式的ORDER By子句

时间:2017-10-10 01:34:24

标签: sql postgresql

我有以下查询。

SELECT 
    mp.id 
FROM
    p_maint_prior pmp
    JOIN maint_prior mp ON(pmp.cid=mp.cid AND pmp.main_pr_id = mp.id)
WHERE
    pmp.property_id = 12345
    AND pmp.cid = 235
    AND pmp.remote_primary_key IS NOT NULL 
ORDER BY 
    mp.maint_prio_type_id = 3,
    mp.maint_prio_type_id DESC
LIMIT 1;

使用此查询,如果它具有类型ID 3,则优先考虑它,否则它将随机给出。想了解有关ORDER BY子句中使用的表达式的更多信息。

1 个答案:

答案 0 :(得分:1)

关闭。这个ORDER BY将3 最后放在

ORDER BY mp.maint_prio_type_id = 3, mp.maint_prio_type_id DESC

原因很简单:" true"大于"假"。如果你这样做,这很容易理解:

ORDER BY (mp.maint_prio_type_id = 3)::int, mp.maint_prio_type_id DESC

这给了" true"值" 1"并且假值为" 0"。排序顺序很明显。

如果你想要" 3"首先,然后将DESC放在第一个键旁边:

ORDER BY (mp.maint_prio_type_id = 3) DESC, mp.maint_prio_type_id DESC

这是一个奇怪的构造,但是 - 就像SQL中的许多东西一样 - 很快就会习惯它。