room-compiler支持FILTER子句吗?

问题描述 投票:0回答:1

我用这样的查询定义 Room Dao:

@Query(
   "SELECT " + 
   "COUNT(*) FILTER(WHERE f > 1) as count1 " +
   "FROM myTable WHERE ..."
)

并得到一个错误:

外部输入 '(' 期望 {, ';', K_ALTER, K_ANALYZE, K_ATTACH、K_BEGIN、K_COMMIT、K_CREATE、K_DELETE、K_DETACH、K_DROP、 K_END、K_EXPLAIN、K_INSERT、K_PRAGMA、K_REINDEX、K_RELEASE、K_REPLACE、 K_ROLLBACK、K_SAVEPOINT、K_SELECT、K_UPDATE、K_VACUUM、K_VALUES、 K_WITH,UNEXPECTED_CHAR}

我想编译器不理解 FILTER 关键字后的“(”。 我在 build.gradle 中使用

kapt "androidx.room:room-compiler:2.4.1"
。 我已经展示了简化的查询,在真实的查询中,我有多个
COUNT(*)
字段,并且无法在
WHERE
之后移动
FROM

我使用了https://www.sqlite.org/lang_aggfunc.html#count

中的聚合器语法
android sqlite count android-sqlite android-room
1个回答
1
投票

自 3.30.0 版本(2019-10-04)起,SQLite 支持聚合函数的

FILTER
子句。
此版本的 SQLite 仅由 Android 用于 API 级别 31+(目前是最新的)。
这意味着,如果您的代码在 API 级别较低的设备上运行,您将无法使用此新功能。

另一种选择是条件聚合:

@Query(
   "SELECT " + 
   "COUNT(CASE WHEN f > 1 THEN 1 END) AS count1 " +
   "FROM myTable WHERE ..."
)

或使用

TOTAL()
聚合函数:

@Query(
   "SELECT " + 
   "TOTAL(f > 1) AS count1 " +
   "FROM myTable WHERE ..."
)
© www.soinside.com 2019 - 2024. All rights reserved.