2017-02-12 68 views
1

最好用一个例子解释:排序特定的顺序,包括NULL,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之前,因为它们都具有相同的产品价值)

现在没有空,我可以那样做:

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

我怎么可以用NULL办呢?

p.s. 我想为许多记录做到这一点,所以它应该是有效的。

+1

什么是逻辑后面有NULL比6和低于27?什么是界限? – Fka

回答

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 
+0

对于成千上万条记录来说,它看起来效率不高,对于每个记录,它会这样做:case' – Roko

+3

@Roko:'case'并不真正增加那么多开销。而“成千上万”的行几乎没有。即使对于数百万行,实际分类将会更加昂贵,那么'case'表达式 –

1

作为一个说明,你可以按照你原来的做法。你只需要一个NULL -safe比较:

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,这是从单独订购的“真”与“假”。

+0

您认为哪种效率更高? – Roko

+0

@Roko。 。 。两者都需要整理数据;关键比较是非常不重要的比较。我只提供了这个答案,因为它似乎是在你的原始代码的精神。 'case'可能更清楚。 –