按特定顺序排序,包括NULL,postgresql

时间:2017-02-12 12:00:44

标签: sql postgresql

最好用一个例子来解释:

所以我有用户表:

id   name   product
1   second    NULL
2   first     27
3   first     27
4   last      6
5   second    NULL

我想按照此产品订单订购它们:[27,NULL, 6] 所以我会得到:

id   name   product
2   first     27
3   first     27
1   second    NULL
5   second    NULL
4   last      6

(通知user id 3可以在user id 2之前,因为它们都具有相同的产品价值)

现在没有NULL,我可以这样做:

SELECT id FROM users ORDER BY users.product=27, users.product=6;

我怎么能用NULL做?

P.S。 我想为许多记录这样做,所以它应该是有效的。

2 个答案:

答案 0 :(得分:2)

您可以使用case生成自定义排序顺序:

select id
from users
order by case 
        when product = 27
            then 1
        when product is null
            then 2
        when product = 6
            then 3
        end

答案 1 :(得分:1)

作为备注,您可以遵循原始方法。您只需要NULL - 安全比较:

SELECT id
FROM users
ORDER BY (NOT users.product IS DISTINCT FROM 27)::int DESC,
         (user.product IS NULL)::int DESC,
         (NOT users.product IS DISTINCT FROM 6)::int DESC;

您的版本有意外结果的原因是因为第一次比较可以返回NULL,它与“true”和“false”分开订购。