Полный динамический запрос базы данных

У меня есть база данных с объектной монетой.

Я хочу сделать динамический запрос с параметром.

Когда я использую параметр для значения, он отлично работает, например:

@Query("select * from coin ORDER BY percent_change_24h asc limit :numberOfCoins") fun getAllTop(numberOfCoins: Int): Flowable<List<CoinDB>> 

Но когда я хочу использовать параметр для предложения WHERE, это не сработает. вот мой запрос:

 @Query("select * from coin ORDER BY :order asc limit :numberOfCoins") fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>> 

И я называю это так:

 AppDatabase.getInstance(this).coinDao().getAllTop("percent_change_24h",5) 

Вызов одного и того же запроса с неявным предложением WHERE работает нормально (вроде этого 🙂

 @Query("select * from coin ORDER BY percent_change_24h asc limit :numberOfCoins") fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>> 

Solutions Collecting From Web of "Полный динамический запрос базы данных"

Вы не можете использовать переменные связывания (параметры) для ссылки на столбцы в предложении 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>> 

Вам нужно будет добавить отдельное предложение WHEN в оператор CASE для каждого столбца / выражения, которое вы хотите отсортировать, и вам может понадобиться или нужно добавить предложение ELSE для ситуаций, когда переменная привязки: порядок не соответствует ни одному из ваши стандартные случаи.

Ограничение на переменные связывания также выполняется для предложения where и проекции (выберите список). Переменная Bind имеет свои собственные значения в ваших примерах: String или Int для: order и: numberOfCoins соответственно.