我有一个项目列表,每个项目都有排名。有些排名为零。如果不是零,我想通过升序查询项目,然后查询排名等于零的剩余项目。我希望这是可以理解的
data class Item(
val id:Int,
val ranking:Int
)
您可以在ORDER BY
子句中使用布尔表达式ranking > 0
,该表达式对true
的求值结果为1
,对false
的求值结果是0
:
SELECT *
FROM tablename
ORDER BY ranking > 0 DESC, ranking;
查看简化的演示
一个选项是,查询两次,然后合并结果集。
@Query("SELECT ... WHERE ranking > 0 ORDER BY ranking DESC")
List<Item> getRankings();
@Query("SELECT ... WHERE ranking = 0")
List<Item> getUnranked();
也可以查询一次,但这需要毫无意义的处理,因为需要返回MAX(ranking) + 1
而不是0
,这样就可以进行所需的排序。在没有基准测试的情况下,不在每一行上使用域聚合应该会更快。为了加快查询的执行速度,我宁愿在字段ranking
上添加一个@Index
。