2014-10-30 107 views
0

我有一列表priority_n列。假設該表中有5個項目。兩個用nil作爲priority_n,其他三個有1,2,3按條件排序兩列?

我想做一個where(priority_n: nil).order(published_at: :desc)加上​​。我希望nil那些在活動記錄關係的開始處,然後是優先順序記錄關係。有沒有辦法做到這一點?

如果我能弄清楚如何在SQL中做到這一點,那麼我可以在rails中做到這一點。

回答

1

以下是標準SQL的order by條款:

order by (case when priority_n is null then 0 else 1 end), 
     priority_n asc 
0

Case語句不會有效利用索引。

ORDER BY priority_N IS NULL DESC, priorit_n ASC 
0

PostgreSQL的,分揀空第一/最後是死的簡單與NULLS FIRST | LAST(標準SQL!):

ORDER BY priority_n NULLS FIRST, published_at 

第二ORDER BY項目,因爲它似乎要訂購與行根據published_atpriority_n相同。

MySQL的沒有實現NULLS FIRST | LAST。替換項:

ORDER BY priority_n IS NOT NULL, priority_n, published_at 

也可以在Postgres中使用。
priority_n IS NOT NULL是一個布爾表達式,其計算結果爲FALSE0)或TRUE1)。 01之前排序(並且在NULL之前,但在這裏不相關),所以priority_n IS NULL排在第一位。