2017-02-12 14 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'可能更清楚。 –