Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/70: Рейтинг темы: голосов - 70, средняя оценка - 4.70
 Аватар для Maden
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130

Фильтрация данных в БД по нескольким полям (TextBox, SQL)

21.04.2011, 17:49. Показов 13922. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Имеется приложение, допустим, телефонная книга. В нем несколько текстовых полей (см. скриншот):



Осуществлено подключение к БД, данные отображаются в гриде.
Задача: Осуществить фильтрацию по различным полям, если пользователь ввел соответсвующие данные в текстовые поля.

На данный момент, я написал такой запрос:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
strSelectFiltered = "SELECT * FROM Users WHERE ([Имя] LIKE ('" & txtName.Text & "%') OR [Имя] IS NULL) " &
                 "AND ([Фамилия] LIKE ('" & txtFam.Text & "%') OR [Фамилия] IS NULL) " &
                 "AND ([Отчество] LIKE ('" & txtOtch.Text & "%') OR [Отчество] IS NULL) " &
                 "AND ([Рабочий_телефон] LIKE ('" & txtRTel.Text & "%') OR [Рабочий_телефон] IS NULL) " &
                 "AND ([Домашний_телефон] LIKE ('" & txtDTel.Text & "%') OR [Домашний_телефон] IS NULL) " &
                 "AND ([Сотовый_телефон] LIKE ('" & txtSTel.Text & "%') OR [Сотовый_телефон] IS NULL) " &
                 "AND ([Подразделение] LIKE ('" & cboDiv.Text & "%') OR [Подразделение] IS NULL) " &
                 "AND ([Бюро_или_Группа] LIKE ('" & cboSubDiv.Text & "%') OR [Бюро_или_Группа] IS NULL) " &
                 "AND ([Должность] LIKE ('" & txtDol.Text & "%') OR [Должность] IS NULL) " &
                 "AND ([Примечание] LIKE ('" & txtMEMO.Text & "%') OR [Примечание] IS NULL) " &
                 "ORDER BY [Подразделение]"
Но как не трудно догадаться - в результаты попадают поля не только с совпадениями, но и пустые тоже.
Пробовал без строки "OR [Какое-то поле] IS NULL". Запрос, вопреки ожиданиям не возвращает данных.

Подскажите как быть, как осуществляется такая фильтрация?

P.S. Как говорится, не хотел "городить огород" по типу:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub Command1_Click()
'Описываем две переменные для поиска
Dim First As String, Second As String
'в переменную First записываем ту часть запроса, которая связана с первым критерием, в 'переменную Second – которая связана со вторым.
 
First = " AND Name LIKE " & "'*" & Text1.Text & "*'"
If Text1.Text = Empty Then First = Empty
Second = " AND City LIKE " & "'*" & Text2.Text & "*'"
If Text2.Text = Empty Then Second = Empty
 
Data1.RecordSource = "select * from Publishers Where PubID<>" & "0" & First & Second
Data1.Refresh
End Sub
пытался решить проблему только с помощью SQL. Предполагаю, что нужно это дело осуществлять с подзапросами, увы, которые я пока не осилил.

Заранее спасибо всем ответившим.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.04.2011, 17:49
Ответы с готовыми решениями:

Фильтрация данных по нескольким полям
работаю в С# c субд Ms Sql Server пытаюсь отфильтровать записи в DataGridView по не скольким данным введенным в поля, при этом я не знаю...

Фильтрация в БД по нескольким полям
Пытаюсь сделать фильтр о нескольким полям. выдаёт ошибку. помогите разобраться. void __fastcall TForm1::Button10Click(TObject *Sender) ...

Фильтрация по нескольким полям
Есть БД в Access. На форме datagridview с данными о преподавателях. Нужно сделать поиск по всем полям(или по максимально возможному...

17
 Аватар для Maden
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
22.04.2011, 16:37  [ТС]
Может быть не через SQL делать, а через LINQ?

P.S. Неужели никто не реализовывал такую фильтрацию?
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
22.04.2011, 18:27
Maden, я честно говоря не очень понял, что ты за запрос хочешь построить.
А так по-моему это просто делается
T-SQL
1
...WHERE x=textbox1.Text AND Y=textbox2.Text AND Z=textbox3.Text AND...
1
 Аватар для Maden
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
22.04.2011, 18:53  [ТС]
Eugene22, нет к сожалению - не работает.

Пробовал по-разному.
Жесткое "=" точно не работает. Если писать выражения с маской "%" то тогда возможен показ не всех строк. В БД имеются столбцы со значением NULL...

Вопрос даже не в том, как переделать этот запрос, а как в принципе должно все быть.
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
22.04.2011, 19:06
Вроде бы должно работать, а что в качестве базы используется?

ну вот я у себя использовал такой код
VB.NET
1
"SELECT Название FROM Регионы WHERE регион=" & regionCode & " AND код_района>0 AND код_населенного_пункта=0"
- эта строка работает -тоже вроде множественный выбор (regionCode - переменная типа Integer, код_района b код_населенного_пункта - столбцы таблицы)
1
 Аватар для Maden
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
22.04.2011, 19:22  [ТС]
В качестве базы Access.

Создаю DataSet, заполняю его через DataAdapter.

В качестве запроса в Access передаю вот ту строку.

Добавлено через 12 минут
Eugene22, проблема в том, что некоторые поля могут оказаться незаполненными и поэтому выпадет исключение...

Вот смотри, как работает этот запрос.

Ввел, допустим, я в поле "фамилия" - текст, остальные поля пустые.


Мой запрос:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
strSelectFiltered = "SELECT * FROM Users WHERE ([Имя] LIKE ('" & txtName.Text & "%') OR [Имя] IS NULL) " &
                 "AND ([Фамилия] LIKE ('" & txtFam.Text & "%') OR [Фамилия] IS NULL) " &
                 "AND ([Отчество] LIKE ('" & txtOtch.Text & "%') OR [Отчество] IS NULL) " &
                 "AND ([Рабочий_телефон] LIKE ('" & txtRTel.Text & "%') OR [Рабочий_телефон] IS NULL) " &
                 "AND ([Домашний_телефон] LIKE ('" & txtDTel.Text & "%') OR [Домашний_телефон] IS NULL) " &
                 "AND ([Сотовый_телефон] LIKE ('" & txtSTel.Text & "%') OR [Сотовый_телефон] IS NULL) " &
                 "AND ([Подразделение] LIKE ('" & cboDiv.Text & "%') OR [Подразделение] IS NULL) " &
                 "AND ([Бюро_или_Группа] LIKE ('" & cboSubDiv.Text & "%') OR [Бюро_или_Группа] IS NULL) " &
                 "AND ([Должность] LIKE ('" & txtDol.Text & "%') OR [Должность] IS NULL) " &
                 "AND ([Примечание] LIKE ('" & txtMEMO.Text & "%') OR [Примечание] IS NULL) " &
                 "ORDER BY [Подразделение]"
Возвращает все практически так как надо: искомые фамилии + еще довесок из строк с NULL значениями.


Если я не пропишу в запросе, скажем, "OR [Фамилия] IS NULL", то запрос не вернет результатов, и будет вообще неадекватно вести себя, натыкаясь на NULL
0
 Аватар для Maden
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
22.04.2011, 19:27  [ТС]
Запрос типа:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
strSelectFiltered = "SELECT * FROM Users WHERE [Имя] LIKE ('" & txtName.Text & "') " &
                 "AND [Фамилия] LIKE ('" & txtFam.Text & "') " &
                 "AND [Отчество] LIKE ('" & txtOtch.Text & "') " &
                 "AND [Рабочий_телефон] LIKE ('" & txtRTel.Text & "') " &
                 "AND [Домашний_телефон] LIKE ('" & txtDTel.Text & "') " &
                 "AND [Сотовый_телефон] LIKE ('" & txtSTel.Text & "') " &
                 "AND [Подразделение] LIKE ('" & cboDiv.Text & "') " &
                 "AND [Бюро_или_Группа] LIKE ('" & cboSubDiv.Text & "') " &
                 "AND [Должность] LIKE ('" & txtDol.Text & "') " &
                 "AND [Примечание] LIKE ('" & txtMEMO.Text & "') " &
                 "ORDER BY [Подразделение]"
Ничего не возвращает. Оно и понятно - цепочка AND-AND-AND нарушается
Миниатюры
Фильтрация данных в БД по нескольким полям (TextBox, SQL)  
0
 Аватар для Maden
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
28.04.2011, 18:04  [ТС]
Неужели никто не сталкивался с подобным? Или это секрет?
0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
28.04.2011, 19:31
А что, обязательно фильтровать прям вот по всем полям, какие есть?
Встречный вопрос. Конструкция LIKE разве работает без маски? Ведь если не использовать "%", смысл самого LIKE?

___________________
Другой момент.
Если все уперлось в Null, может при вводе данных в незаполненных полях ставить пробел или прочерк?
1
 Аватар для Maden
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
28.04.2011, 19:41  [ТС]
Памирыч, да ты прав

Сегодня после недолгих экспериментов понял, что основная моя проблема - это значения NULL, на которые натыкается запрос. Выхода, предполагаю, 2: либо "конвертировать" значения NULL в что-либо еще, либо вручную в БД поставить - как ты предложил - какой-л. символ.

Да, LIKE не имеет большого значения без подстановочных символов.
0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
28.04.2011, 20:46
Сейчас создал проект и базу, все это опробовал.
Если нет какого-то критерия, например, номера телефона, то этот человек вовсе не попадает в фильтр, все как ты и говорил.
Я конечно влепил туда дефисы, но это не дело. Ведь может случиться так, что телефон появился, пользователь стирает прочерк и готовится записать номер, но тут звонит телефон и ему сообщают что он больше в этой организации не работает. Он оставляет поле пустым и закрывает программу, сохранив пустоту в ячейке.

Я к тому, что надо будет или поставить в программу какой то контроль на нули, либо пересматривать фильтрацию.
1
 Аватар для Maden
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
29.04.2011, 16:55  [ТС]
Да... походу придется пересматривать подход к фильтрации...
Порывшись в инете - я так и не нашел решения.

Подумаю еще, может быть что-нибудь "этакое" сворганю...


P.S. Еще раз спасибо всем за ответы.
0
 Аватар для Maden
111 / 111 / 5
Регистрация: 14.01.2011
Сообщений: 130
06.05.2011, 15:37  [ТС]
Я все-таки нашел ответ на свой вопрос.

Кому интересно, запрос теперь будет выглядеть так:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  'НОВЫЙ ЗАПРОС!
            strSelectFiltered = "SELECT * FROM Users WHERE " &
                IIf(txtName.Text <> "", "[Имя] LIKE ('" & txtName.Text & "%')", "([Имя] LIKE ('" & txtName.Text & "%') OR [Имя] IS NULL) ") &
                "AND " &
                IIf(txtFam.Text <> "", "[Фамилия] LIKE ('" & txtFam.Text & "%')", "([Фамилия] LIKE ('" & txtFam.Text & "%') OR [Фамилия] IS NULL) ") &
                "AND " &
                IIf(txtOtch.Text <> "", "[Отчество] LIKE ('" & txtOtch.Text & "%')", "([Отчество] LIKE ('" & txtOtch.Text & "%') OR [Отчество] IS NULL) ") &
                "AND " &
                IIf(txtRTel.Text <> "", "[Рабочий_телефон] LIKE ('" & txtRTel.Text & "%')", "([Рабочий_телефон] LIKE ('" & txtRTel.Text & "%') OR [Рабочий_телефон] IS NULL) ") &
                "AND " &
                IIf(txtDTel.Text <> "", "[Домашний_телефон] LIKE ('" & txtDTel.Text & "%')", "([Домашний_телефон] LIKE ('" & txtDTel.Text & "%') OR [Домашний_телефон] IS NULL) ") &
                "AND " &
                IIf(txtSTel.Text <> "", "[Сотовый_телефон] LIKE ('" & txtSTel.Text & "%')", "([Сотовый_телефон] LIKE ('" & txtSTel.Text & "%') OR [Сотовый_телефон] IS NULL) ") &
                "AND " &
                IIf(cboDiv.Text <> "", "[Подразделение] LIKE ('" & cboDiv.Text & "%')", "([Подразделение] LIKE ('" & cboDiv.Text & "%') OR [Подразделение] IS NULL) ") &
                "AND " &
                IIf(cboSubDiv.Text <> "", "[Бюро_или_Группа] LIKE ('" & cboSubDiv.Text & "%')", "([Бюро_или_Группа] LIKE ('" & cboSubDiv.Text & "%') OR [Бюро_или_Группа] IS NULL) ") &
                "AND " &
                IIf(txtDol.Text <> "", "[Должность] LIKE ('" & txtDol.Text & "%')", "([Должность] LIKE ('" & txtDol.Text & "%') OR [Должность] IS NULL) ") &
                "AND " &
                IIf(txtMEMO.Text <> "", "[Примечание] LIKE ('" & txtMEMO.Text & "%')", "([Примечание] LIKE ('" & txtMEMO.Text & "%') OR [Примечание] IS NULL) ") &
                "ORDER BY [Фамилия] ASC"
1
2 / 2 / 0
Регистрация: 21.03.2012
Сообщений: 46
27.03.2012, 07:53
Вот отрывок из фильтрации данных. При выполнении Delphi7 ссылается на последнию строку и пишет (см. Изображение)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var Uslovie:string;
begin
Uslovie:='';
DM_ado.Query_Glavnay.Active:=False;
DM_ADO.Query_Glavnay.SQL.Clear;
 
if Edit1.Text <> '' then
   Uslovie:=Uslovie+'and( Fam like '+#39+Edit1.Text+'%'+#39+')';
 
If ComboBox1.Text= 'Все' then
    Uslovie:= Uslovie
    else
If ComboBox1.text<>''  then
    Uslovie:= Uslovie+'and( naimen like '+#39+ComboBox1.Text+'%'#39+')';
 
DM_ADO.Query_Glavnay.SQL.Add('select *,  Vzato.vzato-vozvrat.summa_vozvrata as остаток from Klient, Tip_kredita,Vzato, vozvrat'+
'where klient.Id=vzato.Id_klienta and'+
'vzato.nom_kredita=nomer_kredita and'+
'vozvrat.nom_vzato=vzato.nom and'+
'Vozvrat.famlia=Vzato.Famil '+Uslovie);
DM_ADO.Query_Glavnay.Active:=true;
Миниатюры
Фильтрация данных в БД по нескольким полям (TextBox, SQL)  
0
Chups0809
17.07.2012, 11:38
Цитата Сообщение от Maden Посмотреть сообщение
в результаты попадают поля не только с совпадениями, но и пустые тоже.
Пробовал без строки "OR [Какое-то поле] IS NULL". Запрос, вопреки ожиданиям не возвращает данных.
На мой взгляд конструкцию "OR [Какое-то поле] IS NULL" надо везде менять на "OR [Какое-то поле] IS NOT NULL". В общем меняй все IS NULL на IS NOT NULL и будет тебе счастье!
0 / 0 / 0
Регистрация: 16.09.2015
Сообщений: 2
05.08.2012, 11:13
А можно ли этот отрывок запроса перевести в linq в vb.net. я столкнулся с подобной проблемой но я пишу на linq используя datacontext. пытался найти конвертеры но они либо платные либо слишком замудренные. Прошу помочь. Заранее спасибо
0
0 / 0 / 0
Регистрация: 01.05.2015
Сообщений: 1
07.01.2018, 12:28
Пример поиска оборудования по одному или нескольким параметрам.
WinForm + ACCESS
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
private void button3_Click(object sender, EventArgs e)      // поиск
        {
            connection.Open();
            command.Parameters.Clear();
 
            int count = 0;
            command.CommandText = "SELECT * FROM [Оборудование] WHERE ";
 
            if (textBox4.Text != "")
            {
                command.CommandText += "[Инвентарный номер] = ном ";
                command.Parameters.Add("1", OleDbType.Integer).Value = textBox4.Text;
                count++;
            }
            if (textBox5.Text != "")
            {
                if (count == 1)
                    command.CommandText += "AND ";
                command.CommandText += "[Название] = наз ";
                command.Parameters.Add("2", OleDbType.Char).Value = textBox5.Text;
                count++;
            }
            if (comboBox4.Text != "")
            {
                if (count >= 1)
                    command.CommandText += "AND ";
                command.CommandText += "[Категория] = кат ";
                command.Parameters.Add("3", OleDbType.Char).Value = comboBox4.Text;
                count++;
            }
            if (comboBox3.Text != "")
            {
                if (count >= 1)
                    command.CommandText += "AND ";
                command.CommandText += "[Расположение] = рас";
                command.Parameters.Add("4", OleDbType.Integer).Value = comboBox3.Text;
                count++;
            }
 
            if (count == 0)
            {
                command.Parameters.Clear();
                command.CommandText = "SELECT * FROM [Оборудование]";
            }
            command.ExecuteNonQuery();
 
            dataSet.Tables[4].Clear();
            dataSetAdapter.Fill(dataSet.Tables[4]);
 
            connection.Close();
        }
0
1712 / 1375 / 165
Регистрация: 25.07.2015
Сообщений: 2,540
07.01.2018, 17:58
Galactus, жесть : тема почти 6-летней давности + скрипт на Шарпе на форуме VB.NET.
Это ж на до так было заморочиться
НГ + Рождество видимо удались.....
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2018, 17:58
Помогаю со студенческими работами здесь

Фильтрация по нескольким полям
Помогите, надо сделать фильтрация по несколько полям (Фамилия, имя, отчество и телефон). Покидайте примеры,а то найти не могу. Задали по...

Windows Form и база данных Sql фильтрация по нескольким столбцам
Доброго всем дня. У меня есть база данных sql, я к ней подключаюсь и считываю с неё данные, которые записываются в listView1. Также в...

Фильтрация грида по нескольким полям одновременно
как реализовать фильтрацию по нескольким полям использую ADOTable или же ADOQwery?

Фильтрация по нескольким полям как в интернет магазинах
как реализовать фильтр по набору данных, например, как на сайте яндекс маркет. там фильтрация выглядит следующим образом. например, хотим...

Фильтрация по нескольким полям разделенной формы Access 2007
Задача в следующем: есть таблица Main, содержимое ее полей отображается в разделенной (Access 2007) форме Общий_ввод_данных. Фильтрация...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru