Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Фильтрация по неск-м значениям поля [MSSQL]


Users ©   (2004-03-26 15:50:00) 

Нужно выдать фильтрованную таблицу.
Таблица задается вида:


PkId    Code         FieldX
1        1          занчения
2        1             ..
3        2             ..
4        4             ..
5        10            ..
6        2             ..



Хочется получить набор у которого Code может быть, например
1, 2 и 10

Выход был найден в виде :

CREATE PROCEDURE (@CodeFilter varchar(1000) ='*')
 

   Select * From Table1
     WHERE @CodeFilter='*' OR CHARINDEX(',' + CAST(Code AS VARCHAR) + ',', @CodeFilter)>0


Может можно решить эту задачу более правильно, не очень удобно перетаскивать в с.п. varchar(1000)?


Users   (2004-03-29 11:00:00) [1]

2 bushmen ©

В вашем примере минусы:

1) то же что и в моем - переполнение строки; Т.е. допустим
  Input параметр объявим как varchar(1000) - а передадим туда
  больше.
2) Не понятно как сгенерировать @var1, @var2, ... @varNN.
  Для их формирования так же скрипт динамически генерировать?


bushmen   (2004-03-26 17:05:00) [2]

>Это достаточно сложный запрос с функциями агрегирования

А я и не говорю о клиенте - я говорю о сервере. :) У меня в таблицах по 5 000 000 записей и таких таблиц около 10. Сервер справляется.


Users   (2004-03-26 16:53:00) [3]

Таблицу я привел для примера !

На самом деле это отчёт примероно 400 строчек, 12 параметров поиска, 3 из который именно по множественным ключам. Работает он с 9 таблицами и вытягивает ~30 полей. Это достаточно сложный запрос с функциями агрегирования, формировать его на клиенте мне кажется неразумным.


bushmen   (2004-03-26 16:42:00) [4]

>генерация скрипта на лету не есть хорошо, т.к. сложно отлаживать баги

Особенно мне понравилось про баги. :) Для отладки включаешь в процедуру print и отлаживайся на здоровье. Да и тормозов я не замечаю - просто не надо на серваке экономить.


Курдль   (2004-03-26 16:40:00) [5]


> Так я собственно это и делаю используя CHARINDEX


Вы это делаете... через выхлопную трубу...
Кому нужна процедура на сервере, если можно сформировать элементарный запрос на клиенте?


Users   (2004-03-26 16:28:00) [6]

2 Курдль © Так я собственно это и делаю используя CHARINDEX
2 bushmen © генерация скрипта на лету не есть хорошо, т.к. сложно отлаживать баги и нет пред-й компиляции - тормоза в исполнении. Проще уж Query использовать.

Наверное мой вариант более мненее приемлем, единственно что настораживает - переполнение @CodeFilter т.е. если не уложимся в 1000


bushmen   (2004-03-26 16:22:00) [7]

Зачем же - в параметре одной текстовой строкой передаешь и в процедуре строку парсишь. А потом строишь динамический запрос и выполняешь его. Типа:

set @sSQL = 'select * from table where code in(' + @var1 + ', ' + @var2 + ')'
exec(@sSQL)


Курдль   (2004-03-26 16:20:00) [8]


> а как передать множество которое в in ( .... ) ???
>
> Каждый раз ХП править ?


Если количество перечисляемых значений не катастрофическое, то запросто при помощи строковой переменной запроса.


Users   (2004-03-26 16:17:00) [9]

2 Курдль ©

а как передать множество которое в in ( .... ) ???

Каждый раз ХП править ?


Курдль   (2004-03-26 16:12:00) [10]

... where Code in (1, 2, 10)


Users   (2004-03-26 16:11:00) [11]

Вариант Fay © не реализует параметр @CodeFilter='*' т.е. выбор ВСЕХ записей. Можно конечно написать:


if @CodeFilter='*'
 select без join
else
 select с join


но это не очень удобно, а если количество полей для фильтрации >1 не реализуемо (просто получится монст из if ... else ... )


Fay   (2004-03-26 15:59:00) [12]

Типа этого, тока хр типа уже есть у тебя

create procedure BuBuBu
as
select t.* from table1 t join #jopa j on t.code = j.code
go

create table #jopa(code int not null primary key)
insert into #jopa values(1)
insert into #jopa values(2
insert into #jopa values(10)

execute bububu
drop table #jopa


Наверх

Титульная страница Поиск, карта сайта Написать письмо