文件室编译器支持FILTER子句吗



我用这样的查询定义房间道:

@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 ..."
)

相关内容

  • 没有找到相关文章

最新更新