room-compiler 是否支持 FILTER 子句?

Does room-compiler support FILTER clause?

我用这样的Query定义Room Dao:

@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

中的聚合器语法

SQLite 自版本 3.30.0 (2019-10-04) 起支持聚合函数的 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 ..."
)