|
|
|
КАК ЛУЧЩЕ: сложный поиск cо многими (необязательными) параметрами
|
|||
|---|---|---|---|
|
#18+
Всем доброе время суток!! ЛЮДИ! помогите плиз советом в следующей ситуации (надеюсь что данная проблема будет интересна многим кто впервые столкнулся с поискм по нескольким параметрам): 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-ми --------------------------------------------------------------- Нормально ли это ??? --------------------------------------------------------------- надеюсь что никого не запарил длинным вопросом Благодарю всех ответивших!! С уважением, Дмитрий (админ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2002, 16:46:18 |
|
||
|
КАК ЛУЧЩЕ: сложный поиск cо многими (необязательными) параметрами
|
|||
|---|---|---|---|
|
#18+
Ужас какой. А разве нельзя на клиенте составлять готовое условие без всяких case-ов, которое затем просто прицеплять к представлению (в условие where)? Внутри этого представления сделать join всех нужных таблиц - оптимизатор сам уберет лишнее. У нас, по крайней мере, так делается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2002, 00:20:18 |
|
||
|
КАК ЛУЧЩЕ: сложный поиск cо многими (необязательными) параметрами
|
|||
|---|---|---|---|
|
#18+
Объедени все таблицы в одном запросе (наверно нужно создать VIEW), а WHERE напиши примерно так: WHERE Name=isnull(@Name,Name) AND Telefon=isnull(@Telefon,Telefon) AND Street=isnull(@Street,Street) AND ... Я часто использую такой подход. Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2002, 00:31:08 |
|
||
|
|

start [/forum/topic.php?fid=46&gotonew=1&tid=1822573]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
174ms |
get topic data: |
8ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 430ms |

| 0 / 0 |
