Sha*_*har 6 mysql sqlite android kotlin android-room
我有对象硬币的房间数据库.
我想用参数进行动态查询.
当我使用参数作为值时,它的效果很好,如下所示:
@Query("select * from coin ORDER BY percent_change_24h asc limit :numberOfCoins")
fun getAllTop(numberOfCoins: Int): Flowable<List<CoinDB>>
Run Code Online (Sandbox Code Playgroud)
但是当我想为WHERE子句使用参数时,这不起作用.这是我的查询:
@Query("select * from coin ORDER BY :order asc limit :numberOfCoins")
fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>>
Run Code Online (Sandbox Code Playgroud)
我称之为:
AppDatabase.getInstance(this).coinDao().getAllTop("percent_change_24h",5)
Run Code Online (Sandbox Code Playgroud)
使用隐式WHERE子句调用相同的查询工作正常(像这样:)
@Query("select * from coin ORDER BY percent_change_24h asc limit :numberOfCoins")
fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>>
Run Code Online (Sandbox Code Playgroud)
Sen*_*nel 13
您不能使用绑定变量(参数)来引用ORDER BY子句中的列.但是,您可以在表达式中使用bind变量,如下所示:
@Query("select * from coin ORDER BY
CASE :order
WHEN 'percent_change_24h' THEN percent_change_24h
WHEN 'other_column_name' THEN other_column_name
END asc limit :numberOfCoins")
fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>>
Run Code Online (Sandbox Code Playgroud)
对于要排序的每个列/表达式,您需要为CASE语句添加单独的WHEN子句,并且您可能需要或想要为以下情况添加ELSE子句:order bind变量不匹配任何你的标准案例.
绑定变量的限制也适用于where子句和投影(选择列表).绑定变量在您的示例中具有自己的值,分别为String或Int:order和:numberOfCoins.