2014-09-03 2 views
0

Вот мой столПоисковый фильтр на двух полях на основе при условии

create table Table1 (Id int, ...some fields... , CategoryId int, ProfileId int) 

Я хочу написать SP (хранимые процедуры), который даст мне найти результаты из таблицы на основе параметров, передаваемых в СП. Вот моя процедура

Create proc Search 
(
    @MediaType1 varchar(1000), 
    @MediaType2 varchar(1000), 
    @MediaType3 varchar(1000) 
) 

as 

begin 

    select * from table 
    where 
    case when @MediaType1 = '' then 1 else CategoryId end in 
    (select case when @MediaType1 = '' then 1 else Splvalue end 
     from dbo.Split(case @MediaType1 when '0,' then '1,2,3,4' when '' then '1,' else @MediaType1 end,',')) 
    and 
    case when @MediaType2 = '' then 1 else ProfileId end in 
    (select case when @MediaType2 = '' then 1 else Splvalue end 
     from dbo.Split(case @MediaType2 when '0,' then '2,12,13' when '' then '1,' else @MediaType2 end,',')) 
    and 
    case when @MediaType3 = '' then 1 else ProfileId end in 
    (select case when @MediaType3 = '' then 1 else Splvalue end 
     from dbo.Split(case @MediaType3 when '0,' then '1,14,15,16' when '' then '1,' else @MediaType3 end,',')) 

end 

В общем, что я хочу достичь, когда «0» передается в переменной @ MediaType1, он должен вернуть все записи, которые имеют категорию (1.2.3.4) еще надо только эта категория, которая передается (например, 3) иначе, если ее пробел, она должна показывать все записи. То же самое для @ MediaType2 и @ MediaType3, за исключением того, что они должны проверять ProfileId. Условие также состоит в том, что все три или два или один из параметров могут быть пустыми, мне нужно обработать их и показать отфильтрованные записи.

Мой предыдущий запрос работает только в том случае, если один параметр передан и все остальные пусты. Я также пробовал

where 
(@MediaType1 <> '' and Category in (select Splvalue from dbo.Split(@MediaType1,','))) 
or 
(@MediaType2 <> '' and ProfileId in (select Splvalue from dbo.Split(@MediaType2 ,','))) 
or 
(@MediaType3 <> '' and ProfileId in (select Splvalue from dbo.Split(@MediaType3 ,','))) 

но даже это не работает. Любая помощь будет оценена

ответ

0

Я просто написал SP, как это, и она работала

Create proc Search 
(
    @MediaType1 varchar(1000), 
    @MediaType2 varchar(1000), 
    @MediaType3 varchar(1000) 
) 

as 

begin 

    if (@MediaType1 = '' and @MediaType2 = '' and @MediaType3 = '') 
    begin 
    set @MediaType1 = '0,'; 
    set @MediaType2 = '0,'; 
    set @MediaType3 = '0,'; 
    end 

    select * from table 
    where 
    ((@MediaType1 = '0,' and CategoryId in (1,2,3,4)) or (CategoryId in (select Splvalue from dbo.Split(@MediaType1,',')))) 
    or 
    ((@MediaType2 = '0,' and ProfileId in (2,12,13)) or (ProfileId in (select Splvalue from dbo.Split(@MediaType2 ,',')))) 
    or 
    ((@MediaType3 = '0,' and ProfileId in (1,14,15,16)) or (ProfileId in (select Splvalue from dbo.Split(@MediaType3 ,',')))) 

end 
0

Если я просто переписать то, что вы сказали, как условия:

SELECT * FROM table 
WHERE 
(@MediaType1 = '' OR (@MediaType1 = 0 AND CategoryId IN (1,2,3,4)) 
    OR @MediaType1 = CategoryId) 
AND 
    (@MediaType2 = '' OR (@MediaType2 = 0 AND ProfileId IN (1,2,3,4)) 
    OR @MediaType2 = ProfileId) 
AND 
    (@MediaType3 = '' OR (@MediaType3 = 0 AND ProfileId IN (1,2,3,4)) 
    OR @MediaType3 = ProfileId) 
+0

Извините мат, который работал для отдельных параметров но не для нескольких, я прошел 4 в MediaType1, он дал мне записи категории 4, я прошел 16 в MediaType3, мне дали 16, но когда я прошел оба, он дал мне пусто – Hitesh

+0

Вы хотите сделать это с помощью OR вместо AND для каждого mediaType? Обновлен ответ. – Bulat

+0

ну, просто открыли все, теперь фильтры не работают, все видимо каждый раз – Hitesh

Смежные вопросы