我有一个包含列priority_n
的表格。假装该表中有5个项目。其中两个nil
为priority_n
,其他三个为1
,2
,3
。
我希望where(priority_n: nil).order(published_at: :desc)
与where.not(priority_n: nil).order(priority_n: :asc)
结合使用。我想在活动记录关系的开头有nil
个,然后在它们之后有优先级。有没有办法做到这一点?
如果我能弄清楚如何在SQL中执行此操作,那么我可以在rails中执行此操作。
答案 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
是一个布尔表达式,其计算结果为FALSE
(0
)或TRUE
(1
)。 0
在1
之前排序NULL
,但在priority_n IS NULL
之前排序,但此处不相关。),因此{{1}}的行排在第一位。