Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
bakhman
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
#1

Правильный SQL запрос для реализации фильтра списка записей - Программирование Android

17.12.2014, 21:19. Просмотров 456. Ответов 8
Метки нет (Все метки)

Привет всем!

Всю голову уже сломал - то ли через запрос нельзя такое реализовать и нужно в джава коде как-то прописывать, то ли я придумал несуществующий кейс...но вроде такое должно быть где-то:

Кейс:
вытягиваю из 3 полей Edittext значения , которые ввел юзер: Имя, Фамилия, Город.
потом пишу запрос , чтобы система выдала в листвью все записи удовлетворяющие условиям:
1.Показать все записи в которых поля равны введенным юзером: Имя, Фамилия, Город
2. Если юзер не ввел Имя, то отобразить все поля равные Фамилия, Город
3. Если не ввел Фамилию, то все поля равные Имя, Город
4. Если не ввел Город, то все поля равные Имя, Фамилия.
5. Если не ввел Фамилию, Имя , то все поля равные Город
6. Если не ввел Имя, Город , то все поля равные Фамилия
7. Если не ввел Фамилия , Город, то все поля равные Имя

Получается 7 условий.
Вопрос : можно ли все эти 7 условия реализовать через один SQL запрос?

Последняя моя попытка была:

SQL
1
String selectQuery = "SELECT  * FROM record WHERE (mescity='"+ city + "' OR mescity LIKE '%') AND (mesfirstname='" + fname + "' OR mesfirstname LIKE '%') AND (meslastname='" + lname + "' OR meslastname LIKE '%')";
Но тут получается, что система

Добавлено через 6 минут
Но тут получается, что система выдает все поля без исключений, так как есть LIKE условие. Если условие убрать, то будет наоборот система будет выдавать только точные результаты , если все поля заполнены.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2014, 21:19     Правильный SQL запрос для реализации фильтра списка записей
Посмотрите здесь:
SQLite запрос для списка с подчиненными Android
Android Правильный запрос и парсинг даннх
Приложение под Android для фильтра передачи данных Android
SQL запрос Android
Android Что использовать для реализации клиент-серверного приложения?
Android Какой способ предпочтительнее для реализации повторяющейся функции
Android Есть ли для Аndroid класс реализации OpenSSL алгоритмом RSA ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
18.12.2014, 10:46     Правильный SQL запрос для реализации фильтра списка записей #2
Пробуй

Java
1
2
3
4
5
String selectQuery = "SELECT  * FROM record WHERE";
 
iif (!(city.isEmpty()): selectQuery += " (mescity='+ city + "')": selectQuery += " (1)");
iif (!(fname.isEmpty()): selectQuery += " AND (mesfirstname='" + fname + "')":selectQuery += " AND (1)");
iif (!(lname.isEmpty()): selectQuery += " AND (meslastname='" + lname + "')":selectQuery += " AND (1)");
bakhman
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
18.12.2014, 19:32  [ТС]     Правильный SQL запрос для реализации фильтра списка записей #3
ДЖава в андроиде не знает такой оператор "iif" ((
/гугл тоже самое написал((/
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
18.12.2014, 20:06     Правильный SQL запрос для реализации фильтра списка записей #4
Бывает, писал на коленке, фоксовские отголоски...

Java
1
2
3
4
5
String selectQuery = "SELECT  * FROM record WHERE";
 
selectQuery +=(!(city.isEmpty()) ? " (mescity='"+ city + "')": " (1)");
selectQuery +=(!(fname.isEmpty()) ? " AND (mesfirstname='" + fname + "')":" AND (1)");
selectQuery +=(!(lname.isEmpty()) ? " AND (meslastname='" + lname + "')":" AND (1)");
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,724
18.12.2014, 21:24     Правильный SQL запрос для реализации фильтра списка записей #5
bakhman, Armagedo, здесь есть риск получить значения с кавычками и апострофами, поэтому я бы не рекомендовал использовать прямые значения. Советую ознакомиться с Правильно составить запрос, содержащий "'".
Кроме того, неясно, что будет, если пользователь не введёт значения совсем. Показывать 0 записей?
Посему условие запроса я бы переписал примерно так.
Java
1
2
3
4
5
String condition = "";
if (!city.isEmpty)
    condition += "(city = " + DatabaseUtils.sqlEscapeString(city) + ")";
if (!name.isEmpty)
    condition = (condition.isEmpty() ? "" : " AND ") + condition + "(name = " + DatabaseUtils.sqlEscapeString(name) + ")";
И то же условие для фамилии.
Затем сделать проверку condition.isEmpty, и если false, то можно делать запрос.
bakhman
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
18.12.2014, 21:48  [ТС]     Правильный SQL запрос для реализации фильтра списка записей #6
Цитата Сообщение от CoolMind Посмотреть сообщение
Кроме того, неясно, что будет, если пользователь не введёт значения совсем. Показывать 0 записей?
ну исходя из того, что пустые значения означают отсутствие критериев- просто выводятся тогда все сообщения без критериев.

Спасибо большое!! попробую сейчас
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
18.12.2014, 22:02     Правильный SQL запрос для реализации фильтра списка записей #7
CoolMind, согласен по поводу DatabaseUtils.sqlEscapeString.

В остальном - на вкус и цвет все фломастеры разные.
Как хотИт аскер, так пусть и пишет.
Главное - идея.
Адьос
bakhman
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
18.12.2014, 22:36  [ТС]     Правильный SQL запрос для реализации фильтра списка записей #8
спасибо парни! всё работает!! запланирую попозже разобраться в этом сложном запросе

Добавлено через 10 минут
а поясните пожалуйста , что значит таинственное (1) ? - почему система разрешает иметь (1) во всех полях кроме указанного и выдает результаты?
т.е. например: SELECT * FROM record WHERE (1) AND (1) AND (1) AND (1) AND (messtime='1990-2000')
это значит что (1) - спец обозначение заполненнного поля, но любым значением?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2014, 23:13     Правильный SQL запрос для реализации фильтра списка записей
Еще ссылки по теме:
С чего начать написание приложения? И что понадобится для его реализации Android
Как лучше хранить небольшие (до 50 записей) и крупные до 600-1000 записей данные? Android
Фон для списка на CustomAdapter Android
Android Использование интент фильтра
Адаптер для списка сообщений мессенджера Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
18.12.2014, 23:13     Правильный SQL запрос для реализации фильтра списка записей #9
Ничего оно не таинственное.
В SQLite нет логических истины и ложь.
Ну, оно как бы и есть там тип BOOLEAN, но на самом деле никакого true или false - нет, а есть соответствующие им целочисленные 1 и 0, которые и храянтся дальше в таблицах.
Поэтому в принципе советуют не пользоваться BOOLEAN в SQLite, чтобы не нажить себе неприятностей на одно место, а пользовать integer - 1 или 0.

Т.е. (1) здесь читай как TRUE.

Ну, а дальше свойства конъюнкции, в которых простые ТRUE никак не влияют на результат общего условия - ведь грубо - каждый ТRUE это логическое умножение на 1.
В этом собственно и фокус их такого использования.

Ну, а вводятся они с тем, чтобы при любых раскладах значений получить корректное выражение для SQL запроса.

Еще один вариант расписал CoolMind, у него не будет никаких (1) или (0).

Что больше по нутру и понятнее, то и положи в голову
Yandex
Объявления
18.12.2014, 23:13     Правильный SQL запрос для реализации фильтра списка записей
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru