Android SQLite Union 对多个查询结果进行组合

更新日期: 2021-02-18 阅读次数: 70 字数: 221 分类: Android

例如,在 Android App 中,我想从本地 SQLite 数据库中,取所有未完成的任务,及已完成的任务的前50条。限制读取已完成条数是为了防止数据量过大,内存不可控。

Room 中的查询 SQL

在 DAO 代码中:

@Query("""
	SELECT * FROM (
		SELECT * FROM (SELECT * FROM todos WHERE done = 0)
		UNION
		SELECT * FROM (SELECT * FROM todos WHERE done = 1 ORDER BY id DESC LIMIT 50)
	) ORDER BY done ASC, id DESC
""")
fun getTodos(): Flow<List<Todo>>

无效的 SQL 写法

无效 SQL 一:

@Query("""
	SELECT * FROM todos WHERE done = 0 ORDER BY id DESC
	UNION
	SELECT * FROM todos WHERE done = 1 ORDER BY id DESC LIMIT 50
""")
fun getTodos(): Flow<List<Todo>>

Android Studio 编译时报错, Execution failed for task ':app:kaptDebugKotlin':

LIMIT, comma or semicolon expected, got 'UNION'

无效 SQL 二:

@Query("""
	SELECT * FROM (SELECT * FROM todos WHERE done = 0 ORDER BY id DESC)
	UNION
	SELECT * FROM (SELECT * FROM todos WHERE done = 1 ORDER BY id DESC LIMIT 50)
""")
fun getTodos(): Flow<List<Todo>>

使用这个 SQL,返回的结果呈无序状态。待办事项无法排在已完成项的前面。

参考

  • https://www.tutorialspoint.com/sqlite/sqlite_unions_clause.htm
领取阿里云/腾讯云服务器优惠券

关于作者

我是来自山东烟台的一名开发者,喜欢瞎折腾,顺便记记笔记。有敢兴趣的话题,欢迎加微信 zhongwei 聊聊, 查看更多联系方式。 白天写程序,晚上哄熊孩子,可能回复有点慢,见谅。同时也欢迎关注我的微信公众号“大象工具”: 大象工具微信公众号

相关文章

爱评论不评论

近期节日

查看更多节日