Задать вопрос

Как сделать SQLite запрос с условием для разных полей?

Android Studio. У меня в программке 4 поля для ввода ингредиентов, хочу чтоб вне зависимости от того в какое поле введешь ингредиент, поиск осуществлялся по всем полям таблицы. (в таблице помимо id имеется 4 поля с ингредиентами). 4 поля нужн для поиска допустим по 2,3 или 4 игредиентам. Тоесть, если мы заполнили все 4 поля то должен быть отобран только рецепт который содержит все эти 4 ингредиента, но вне зависимости от их порядка в полях для этого блюда.
Запрос которым я надеялся это сделать :
String sqlQuery = "SELECT * "
                + "from dishtab "
                + "inner join ingrtab "
                + "on dishtab._id = ingrtab._id "
                + "where ingrtab.ingr_1 = ? OR ingr_2 = ? OR ingr_3 = ? OR ingr_4 = ?";
        c = mDB.rawQuery(sqlQuery, new String[] {ingr1, ingr2, ingr3, ingr4} );

Этот запрос меня не устраивает, так как он ищет по конкретным полям. Подскажите как написать запрос который будет искать по всем полям, для любого 4 вводных данных? Тоесть, как я понимаю, вместо каждого вопросика "?" должны подставляться все четыре переменные ingr1, ingr2, ingr3, ingr4 а не по одной на каждый вопросик.
  • Вопрос задан
  • 1315 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
TonyWrong
@TonyWrong Автор вопроса
Всем кто дал коментарии спасибо, без вас бы не разобрался! Привожу запрос который наконец-таки делает то, что мне нужно:
"where (ingrtab.ingr_1 = @ingr1 OR ingrtab.ingr_2 = @ingr1 OR ingrtab.ingr_3 = @ingr1 OR ingrtab.ingr_4 = @ingr1) AND (ingrtab.ingr_1 = @ingr2 OR ingrtab.ingr_2 = @ingr2 OR ingrtab.ingr_3 = @ingr2 OR ingrtab.ingr_4 = @ingr2) AND (ingrtab.ingr_1 = @ingr3 OR ingrtab.ingr_2 = @ingr3 OR ingrtab.ingr_3 = @ingr3 OR ingrtab.ingr_4 = @ingr3) AND (ingrtab.ingr_1 = @ingr4 OR ingrtab.ingr_2 = @ingr4 OR ingrtab.ingr_3 = @ingr4 OR ingrtab.ingr_4 = @ingr4)";

Но есть одно важное примечание, этот код ищет по количеству переменных от 1 до 3, а четвертая переменная должна быть пустышкой (в моем случае текстовое значение "null") кроме этого, в каждой строке четвертое поле ингредиента должно быть идентичной пустышкой, тогда все работает!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@dmitryKovalskiy
программист средней руки
Если я правильно понял, то можно создать 4 sql-переменных и писать что-то вроде
(@ingr1 is NULL OR ingr1=@ingr1)OR (@ingr2 is NULL OR ingr2=@ingr2) OR (@ingr3 is NULL OR ingr3=@ingr3) OR (@ingr4 is NULL OR ingr4=@ingr1)
Ответ написан
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
может так?
where ingrtab.ingr_1 IN (?,?,?,?) OR ingr_2 = (?,?,?,?) OR ingr_3 = (?,?,?,?) OR ingr_4 = (?,?,?,?)
Ответ написан
@nozzy
Symfony, Laravel, SQL, Python, Telegram
where ingrtab.ingr_1 in (?,?,?,?)
or ingrtab.ingr_2 in (?,?,?,?)
or ingrtab.ingr_3 in (?,?,?,?)
or ingrtab.ingr_4 in (?,?,?,?)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы