Sum()函数在Room数据库android中不起作用
Posted
技术标签:
【中文标题】Sum()函数在Room数据库android中不起作用【英文标题】:Sum() function with over not work in Room database android 【发布时间】:2021-07-30 08:05:52 【问题描述】:谁能帮我以下查询在 DB Browser 中运行良好,但不适用于 Room
数据库。这是表格和查询:
表Transaction
:
id | amount | is_credit |
---|
查询:
SELECT *
FROM
(SELECT
id, amount,
SUM(CASE WHEN is_credit = 1 THEN amount ELSE -amount END) OVER (ORDER BY id) AS balance
FROM `Transaction`)
ORDER BY
id DESC;
我已尝试使用 SimpleSQLiteQuery
进行此查询,但出现错误:
E/SQLiteLog: (1) "(" 附近:语法错误
【问题讨论】:
【参考方案1】:如果您的 SQLite 版本低于 3.25.0,则不能像 SUM()
一样使用 window functions。
相反,您可以使用相关子查询来做到这一点:
SELECT t.id,
t.amount,
(SELECT SUM(CASE WHEN tt.is_credit = 1 THEN 1 ELSE -1 END * tt.amount) FROM `Transaction` tt WHERE tt.id <= t.id) AS balance
FROM `Transaction` t
ORDER BY t.id DESC;
或自加入:
SELECT t.id,
t.amount,
SUM(CASE WHEN tt.is_credit = 1 THEN 1 ELSE -1 END * tt.amount) AS balance
FROM `Transaction` t INNER JOIN `Transaction` tt
ON tt.id <= t.id
GROUP BY t.id
ORDER BY t.id DESC;
查看简化的demo。
【讨论】:
【参考方案2】:您正在尝试使用 SQLite Windows 函数,即 OVER android 设备上的 SQLite 版本通常落后一些。对于 SQLite 版本 3.28.0(引入 Windows 函数时),您至少需要 API 30 (Android R)。显然,这会限制应用的安装基础。
你不妨看看Version of SQLite used in Android?
【讨论】:
了解问题,您能帮我解决相同查询的替代解决方案吗?如何将相同的结果归档到另一个查询中。以上是关于Sum()函数在Room数据库android中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Android Room Dao:按 CASE 排序不起作用