按条件排序两列?

时间:2014-10-30 02:38:16

标签: mysql sql postgresql sql-order-by

我有一个包含列priority_n的表格。假装该表中有5个项目。其中两个nilpriority_n,其他三个为123

我希望where(priority_n: nil).order(published_at: :desc)where.not(priority_n: nil).order(priority_n: :asc)结合使用。我想在活动记录关系的开头有nil个,然后在它们之后有优先级。有没有办法做到这一点?

如果我能弄清楚如何在SQL中执行此操作,那么我可以在rails中执行此操作。

3 个答案:

答案 0 :(得分:1)

以下是标准SQL中的order by子句:

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

答案 1 :(得分:0)

案例陈述无法有效利用索引。

ORDER BY priority_N IS NULL DESC, priorit_n ASC 

答案 2 :(得分:0)

PostgreSQL 中,使用(标准SQL!)NULLS FIRST | LAST排序第一个/最后一个空是简单的:

ORDER BY priority_n NULLS FIRST, published_at

第二个ORDER BY项,因为您似乎想根据priority_n订购具有相同published_at的行。

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之前排序,但此处不相关。),因此{{1}}的行排在第一位。