Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: CL | DM;

Вниз

Фильтрация по неск-м значениям поля   Найти похожие ветки 

 
Users   (2004-03-26 15:50) [0]

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


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)?


 
Fay ©   (2004-03-26 15:59) [1]

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

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


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

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


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


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


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

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


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

2 Курдль ©

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

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


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


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


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


 
bushmen ©   (2004-03-26 16:22) [6]

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

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


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

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

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


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


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


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


 
bushmen ©   (2004-03-26 16:42) [9]

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

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


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

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

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


 
bushmen ©   (2004-03-26 17:05) [11]

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

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


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

2 bushmen ©

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.04.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
4-1077375989
Юрий Ж.
2004-02-21 18:06
2004.04.25
Дата создания директории...


3-1080536840
Olegka
2004-03-29 09:07
2004.04.25
надо в инсталл проги вставить инсталл Firebird.


11-1063796734
Revolter
2003-09-17 15:05
2004.04.25
VCL: (ssCtrl in shift); KOL: ?


3-1080227024
Andriy Tysh
2004-03-25 18:03
2004.04.25
ClientDataSet.SaveToFile


6-1077962919
Kolyan
2004-02-28 13:08
2004.04.25
TelnetServer