Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
bakhman
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
1

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

17.12.2014, 21:19. Просмотров 533. Ответов 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 условие. Если условие убрать, то будет наоборот система будет выдавать только точные результаты , если все поля заполнены.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2014, 21:19
Ответы с готовыми решениями:

SQLite запрос для списка с подчиненными
Помогите пожалуста составить запрос (подзабыл азы SQLite - давно не работал)....

Правильный запрос и парсинг даннх
Здравствуйте. Столкнулся с проблемой на этапе запуска программы. В eclipce в...

SQL запрос для фильтра товаров
Добрый день. Я сейчас занимаюсь разработкой сайта с каталогом товаров и в...

Помогите посторить правильный SQL запрос для MySQL
есть две таблицы 1. domain Содержит поля: Id domain_name 2. domain_alias...

Правильный запрос SQL
Здравствуйте, помогите создать правельный SQL запрос. Есть таблица с...

8
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
18.12.2014, 10:46 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)");
0
bakhman
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
18.12.2014, 19:32  [ТС] 3
ДЖава в андроиде не знает такой оператор "iif" ((
/гугл тоже самое написал((/
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
18.12.2014, 20:06 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)");
1
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,732
18.12.2014, 21:24 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, то можно делать запрос.
1
bakhman
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
18.12.2014, 21:48  [ТС] 6
Цитата Сообщение от CoolMind Посмотреть сообщение
Кроме того, неясно, что будет, если пользователь не введёт значения совсем. Показывать 0 записей?
ну исходя из того, что пустые значения означают отсутствие критериев- просто выводятся тогда все сообщения без критериев.

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

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

Добавлено через 10 минут
а поясните пожалуйста , что значит таинственное (1) ? - почему система разрешает иметь (1) во всех полях кроме указанного и выдает результаты?
т.е. например: SELECT * FROM record WHERE (1) AND (1) AND (1) AND (1) AND (messtime='1990-2000')
это значит что (1) - спец обозначение заполненнного поля, но любым значением?
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
18.12.2014, 23:13 9
Ничего оно не таинственное.
В SQLite нет логических истины и ложь.
Ну, оно как бы и есть там тип BOOLEAN, но на самом деле никакого true или false - нет, а есть соответствующие им целочисленные 1 и 0, которые и храянтся дальше в таблицах.
Поэтому в принципе советуют не пользоваться BOOLEAN в SQLite, чтобы не нажить себе неприятностей на одно место, а пользовать integer - 1 или 0.

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

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

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

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

Что больше по нутру и понятнее, то и положи в голову
1
18.12.2014, 23:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2014, 23:13

Правильный sql запрос
Нужно создать таблицу из 2 существующих таблиц, причем: 1) Все поля из...

Правильный SQL запрос
у меня есть две таблицы, которые мне нужно объеденить по одному полю. В первой...

Правильный запрос SQL
Здравствуйте! Скажите как правильно написать запрос... есть таблица osn_base...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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