powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / КАК ЛУЧЩЕ: сложный поиск cо многими (необязательными) параметрами
3 сообщений из 3, страница 1 из 1
КАК ЛУЧЩЕ: сложный поиск cо многими (необязательными) параметрами
    #32031348
Всем доброе время суток!!

ЛЮДИ! помогите плиз советом в следующей ситуации (надеюсь что данная проблема будет интересна многим
кто впервые столкнулся с поискм по нескольким параметрам):

1): допустим что у меня есть таблицы (всего таблиц 8 штук) связанные через Firm_Id (связь один-ко-многим)
которые хранят данные о юр/лицах типа: "Основные данные" (название,регистрационный номер, ИНН, и т/д),
"Адреса" (улица,дом,офис), "Телефоны", и т/д

2): поиска некой записи по некоторым значениям в колонках, причем эти колонки из разных связанных таблиц.

3): пользователь для поиска юр/лица указывает в клиенте несколько параметров, при этом он какие то параметры
может не указывать, например указать только название или телефон, или и то и другое и еще другие параметры
(т/е клиент может делать поиск по значениям в любой из 8 таблиц).

---------------------------------------------------------------
Намекните как лучше конструктивно запрограммировать такой поиск ???
---------------------------------------------------------------

понятно что можно использовать Select с CASE-ом например для 3-х таблиц
"Firms", "FirmAddresses", "FirmTelefons"

\nCreate proc sp_Search (
@FirmName varchar(50) = Null, @FirmStreet varchar(50) = Null,
@FirmTelefon varchar(7) = Null /*, и другие параметры.. */)
As
Begin
select f1.Firm_Id from
Firms f1 inner join FirmTelefons f2 on f1.Firm_Id = f2.Firm_Id
inner join FirmAddresses f3 on f1.Firm_Id = f3.Firm_Id
/*
....другие секции Join-а для других таблиц
*/
where f1.Name LIKE (Case when @Name is Null then f1.Name
else '%' + @Name + '%' End)
and f2.Telefon LIKE (Case when @Telefon is Null then f2.Telefon
else '%' + @Telefon + '%' End)
and f3.Street LIKE (Case when @Street is Null then f1.Street
else '%' + @Street + '%' End)
/*
....другие секции Where для проверки других параметров
*/
End


где значение Null для параметра означает что __не надо делать поиск__ по этому параметру
(т/е клиент не задал значение этого параметра.)

Select с Case-ом можно было бы запихнуть в одну процедуру (или представление) но с учетом
с учетом возможных обработок значений параметров она станет АБСОЛЮТНО нечитаемой
и к тому же получается Join из 8 (!!) таблиц и еще с Case-ми

---------------------------------------------------------------
Нормально ли это ???
---------------------------------------------------------------

надеюсь что никого не запарил длинным вопросом

Благодарю всех ответивших!!
С уважением,
Дмитрий (админ)
...
Рейтинг: 0 / 0
КАК ЛУЧЩЕ: сложный поиск cо многими (необязательными) параметрами
    #32031353
Sergey Vinogradov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ужас какой.

А разве нельзя на клиенте составлять готовое условие без всяких case-ов,
которое затем просто прицеплять к представлению (в условие where)?

Внутри этого представления сделать join всех нужных таблиц - оптимизатор сам уберет лишнее.

У нас, по крайней мере, так делается.
...
Рейтинг: 0 / 0
КАК ЛУЧЩЕ: сложный поиск cо многими (необязательными) параметрами
    #32031355
Фотография sparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объедени все таблицы в одном запросе (наверно нужно создать VIEW), а WHERE напиши примерно так:

WHERE Name=isnull(@Name,Name) AND Telefon=isnull(@Telefon,Telefon) AND Street=isnull(@Street,Street) AND ...

Я часто использую такой подход.
Удачи.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / КАК ЛУЧЩЕ: сложный поиск cо многими (необязательными) параметрами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]