我用这样的查询定义 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
。
中的聚合器语法
自 3.30.0 版本(2019-10-04)起,SQLite 支持聚合函数的
FILTER
子句。另一种选择是条件聚合:
@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 ..."
)