我用这样的查询定义房间道:
@Query(
"SELECT " +
"COUNT(*) FILTER(WHERE f > 1) as count1 " +
"FROM myTable WHERE ..."
)
并得到一个错误:extraneous input '(' expecting {<EOF>, ';', 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(*)
字段,并且不能在FROM
之后移动WHERE
。
我使用了来自https://www.sqlite.org/lang_aggfunc.html#count
自3.30.0版(2019-10-04(起,SQLite支持聚合函数的FILTER
子句
Android仅将此版本的SQLite用于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 ..."
)