Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.037 c
3-1080151731
Doctor Deejay
2004-03-24 21:08
2004.04.25
Фильтрация


1-1081628476
Ertong
2004-04-11 00:21
2004.04.25
Proxies.dcu


4-1077406924
OverSet
2004-02-22 02:42
2004.04.25
Перемещение заголовка окна


14-1080769770
easy
2004-04-01 01:49
2004.04.25
проздравляю с праздником..


7-1075292544
Deleter_low
2004-01-28 15:22
2004.04.25
Как удалить используемый файл?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский