我有一列表priority_n
列。假設該表中有5個項目。兩個用nil
作爲priority_n
,其他三個有1
,2
,3
。按條件排序兩列?
我想做一個where(priority_n: nil).order(published_at: :desc)
加上。我希望nil
那些在活動記錄關係的開始處,然後是優先順序記錄關係。有沒有辦法做到這一點?
如果我能弄清楚如何在SQL中做到這一點,那麼我可以在rails中做到這一點。
我有一列表priority_n
列。假設該表中有5個項目。兩個用nil
作爲priority_n
,其他三個有1
,2
,3
。按條件排序兩列?
我想做一個where(priority_n: nil).order(published_at: :desc)
加上。我希望nil
那些在活動記錄關係的開始處,然後是優先順序記錄關係。有沒有辦法做到這一點?
如果我能弄清楚如何在SQL中做到這一點,那麼我可以在rails中做到這一點。
以下是標準SQL的order by
條款:
order by (case when priority_n is null then 0 else 1 end),
priority_n asc
Case語句不會有效利用索引。
ORDER BY priority_N IS NULL DESC, priorit_n ASC
在PostgreSQL的,分揀空第一/最後是死的簡單與NULLS FIRST | LAST
(標準SQL!):
ORDER BY priority_n NULLS FIRST, published_at
第二ORDER BY
項目,因爲它似乎要訂購與行根據published_at
的priority_n
相同。
MySQL的沒有實現NULLS FIRST | LAST
。替換項:
ORDER BY priority_n IS NOT NULL, priority_n, published_at
也可以在Postgres中使用。
priority_n IS NOT NULL
是一個布爾表達式,其計算結果爲FALSE
(0
)或TRUE
(1
)。 0
在1
之前排序(並且在NULL
之前,但在這裏不相關),所以priority_n IS NULL
排在第一位。