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

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

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

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

17.12.2014, 21:19. Просмотров 469. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Правильный SQL запрос для реализации фильтра списка записей (Программирование Android):

SQLite запрос для списка с подчиненными - Программирование Android
Помогите пожалуста составить запрос (подзабыл азы SQLite - давно не работал). Скажите хотя-бы ВОЗМОЖНО ЛИ ПОДОБНОЕ? (что-бы время зря не...

Правильный запрос и парсинг даннх - Программирование Android
Здравствуйте. Столкнулся с проблемой на этапе запуска программы. В eclipce в логе выводит такой результат: 10-20 05:52:27.700:...

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

Правильный запрос SQL - PHP БД
Здравствуйте, помогите создать правельный SQL запрос. Есть таблица с заказами, каждый заказ имеет повторяющийся order.id_order. На...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Armagedo
208 / 208 / 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
208 / 208 / 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
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
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
208 / 208 / 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
208 / 208 / 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2014, 23:13
Привет! Вот еще темы с ответами:

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

Правильный SQL запрос на поиск - PHP БД
Приветствую всех! // подключение к бд $db_connect = new PDO('mysql:dbname=table;host=localhost', 'root', ''); // получаем...

Для реализации записей использовать списки свойств атомов. Массив записей нужно считывать из файла - Lisp
Помогите с лиспом пожалуйста. Ведомость сдачи экзамена содержит следующие графы: номер по порядку, фамилия студента, номер зачётной...

Помогите написать правильный SQL-запрос - Базы данных
Суть вот в чем: необходимо вставить строку в таблицу, но таким образом, чтобы по запросу не только вставлялась строка, но еще и ...


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

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

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