按条件排序两列?
问题描述:
我有一列表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
相同。
- PostgreSQL sort by datetime asc, null first?
- ORDER BY DATE showing NULLS first then most recent dates
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
排在第一位。