按条件排序两列?

问题描述:

我有一列表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_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排在第一位。