You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单个@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:18:21