Форум: "Базы";
Текущий архив: 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.47 MB
Время: 0.044 c