如何用单个@Query语句返回Android Room数据库两个查询的结果?
解决方案
你可以不用UNION/UNION ALL,直接通过条件排序实现需求,更高效且语法简洁:
@Query(""" SELECT * FROM cards ORDER BY -- 有到期时间的条目排在前面 CASE WHEN cardDuedatentime != -1 THEN 0 ELSE 1 END, -- 有到期时间的按到期时间升序 CASE WHEN cardDuedatentime != -1 THEN cardDuedatentime END ASC, -- 无到期时间的按存入时间戳降序 CASE WHEN cardDuedatentime = -1 THEN timestamp END DESC """) fun getAllCardsSorted(): Flow<List<Card>> // 可根据实际需求调整返回类型
为什么你之前用UNION失败?
如果坚持要用UNION ALL,需要注意SQLite的语法限制:子查询的ORDER BY必须配合LIMIT才能生效,否则会被优化忽略。正确写法如下:
@Query(""" SELECT * FROM ( SELECT * FROM cards WHERE cardDuedatentime != -1 ORDER BY cardDuedatentime ASC LIMIT 1000000 -- 设置一个远大于数据表容量的数值 ) UNION ALL SELECT * FROM ( SELECT * FROM cards WHERE cardDuedatentime = -1 ORDER BY timestamp DESC LIMIT 1000000 ) """) fun getAllCardsSorted(): Flow<List<Card>>
推荐方案
优先选择条件排序的写法,因为它只需要扫描一次数据表,性能比两次查询合并的UNION ALL更好,代码也更易维护。
内容的提问来源于stack exchange,提问作者AJW
相关产品推荐
相关产品推荐

