我读了article
代码A可以在Android Studio中很好地工作。
目前,我希望先按starred desc
对记录进行排序,然后再按createdDate desc
进行排序,因此我将Code A替换为Code B。
代码B可以编译和运行,但我得到错误结果,所有情况都指向“Case WHEN :sortBy = 'TEXT_ASC' THEN text END asc"
”。
顺便说一句,代码C和代码D无法编译。
代码A
@Query("SELECT * FROM info_table ORDER BY " +
"CASE WHEN :sortBy = 'START_PRIORITY' THEN starred END desc, " +
"Case WHEN :sortBy = 'TEXT_DESC' THEN text END desc, "+
"Case WHEN :sortBy = 'TEXT_ASC' THEN text END asc"
)
代码B
@Query("SELECT * FROM info_table ORDER BY " +
"CASE WHEN :sortBy = 'START_PRIORITY' THEN starred END desc, createdDate desc," +
"Case WHEN :sortBy = 'TEXT_DESC' THEN text END desc, "+
"Case WHEN :sortBy = 'TEXT_ASC' THEN text END asc"
)
代码C
@Query("SELECT * FROM info_table ORDER BY " +
"CASE WHEN :sortBy = 'START_PRIORITY' THEN starred ,createdDate END desc, " +
"Case WHEN :sortBy = 'TEXT_DESC' THEN text END desc, "+
"Case WHEN :sortBy = 'TEXT_ASC' THEN text END asc"
)
代码D
@Query("SELECT * FROM info_table ORDER BY " +
"CASE WHEN :sortBy = 'START_PRIORITY' THEN starred END desc, THEN createdDate END desc," +
"Case WHEN :sortBy = 'TEXT_DESC' THEN text END desc, "+
"Case WHEN :sortBy = 'TEXT_ASC' THEN text END asc"
)
1条答案
按热度按时间wqnecbli1#
我不相信你想要的是可行的使用
CASE WHEN THEN ELSE END
结构,因为它们只能用于表达式是可接受的。*注参见其他,因为使用
CASE WHEN THEN ELSE END
结构是可行的。然而,使用CTE可能更容易理解。然而,由于您似乎认为其他选项,根据您问题中的链接,不可接受,那么第四种方法可能是利用公共表表达式(CTE)和/或子查询(前者通常更简单)。
此方法可能涉及3个底层查询(CTE),其中只有一个将根据
WHERE
子句返回任何行,相应地SELECT
s和ORDER
s。最后的输出是使用UNION
s组合的3个查询。考虑使用SQLite工具(Navicat)的这个示例/演示,注意它演示了所有3种排列:
结果为(根据运行顺序):-
然后,只需将其中一个运行放入
@Query
的SQL中,并对其进行裁剪以传递变量:例如:-
为了实际证明这一点,与B、C和D相比,考虑以下活动代码:
db = TheDatabase.getInstance(this)dao = db. getAllDAO()
其中
logInfo
为:结果**
从你的代码:-
根据CTE驱动查询:-
其他
在考虑了这个问题之后,
CASE WHEN THEN ELSE END
结构的顺序很重要,对它们进行重新排序可以获得预期的结果。需要考虑的是,END之后的任何内容都包括在内。当第一个构造不匹配时,你会得到类似的东西:
或
因此最高优先级排序将是
createdDate DESC
,因此TEXT列是第二排序,因此可能无用。注意,没有解析的表达式基本上是相同的值,因此排序不受影响。
现在,如果你有:
那么
createdDate
将始终是次要排序顺序。所以使用:-将导致:
即,命令现在看起来是正确的。