У меня возникли проблемы с поиском информации об этой проблеме, но, похоже, это ограничение SQLite.
Рассмотрим простую таблицу words
с 2 полями, _id
(int) и word
(текст). Следующий запрос работает и возвращает ожидаемые результаты (все слова, длина которых не превышает 12 символов):
SELECT * FROM words WHERE LENGTH(word) <= 12;
Однако, если этот предел должен быть динамическим c и преобразован в параметр, запрос no дольше работает. Он возвращает все строки таблицы:
String query = "SELECT * FROM words WHERE LENGTH(word) <= ?";
Cursor cursor = database.rawQuery(query, new String[]{ Integer.toString(12) });
Я также попытался выбрать длину в качестве нового столбца, а затем применить к ней условие, но это дает те же результаты:
String query = "SELECT w.*, LENGTH(w.word) AS word_length FROM words w WHERE word_length <= ?";
Cursor cursor = database.rawQuery(query, new String[]{ Integer.toString(12) });
Является ли моя единственная возможность просто фильтровать результаты запроса после этого? Почему параметризованные условия в обычных столбцах INT работают, а не в LENGTH ()? (например, WHERE _id < ?
отлично работает)