2015-06-08 6 views
6

У меня есть таблица событий, в которой есть поле автора и поле ведущего. Человек из таблицы моего лица может быть как автором, так и ведущим одного и того же мероприятия, или они могут быть либо ведущими, либо автором. Мне нужно применить фильтры к набору результатов на основе их идентификатора лица и выбранного им типа или фильтра. У меня есть фильтры:SQL Select Statement Где

Все: Это возвращает любые записи, в которых они являются либо автором, либо ведущим.

AllPresenter: все записи в качестве докладчика.

AllAuthor: все записи как автор.

PresenterOnly: только записи как ведущие, а не автор.

AuthorOnly: только записи как автор, а не ведущий.

PresenterAndAuthorOnly: все записи, в которых они являются ведущим и автором.

В настоящее время у меня есть сохраненный proc, который использует внешние ifs, как показано ниже, и я попытался найти способ объединить все эти похожие операторы select в один. Мне не повезло найти лучшее решение, и мне интересно, не хватает ли я техники.

If (@filter = 'PandAOnly' or @filter = 'AllP' or @filter = 'AllA') 
begin 
    Select * from Event 
    Where 
     PresenterId = Case @personId is null then PresenterId else @personId end 
     and 
     AuthorId = Case @personId is null then AuthorId else @personId end 
end 
else if (@filter = 'All') 
begin 
    Select * from Event 
    Where 
     PresenterId = @personId 
     Or 
     AuthorId = @personId 
end 
else if (@fitler = 'POnly') 
begin 
    Select * from Event 
    Where 
     PresenterId = @personId 
     and 
     AuthorId <> @personId 
end 
else 
begin 
    Select * from Event 
    Where 
     AuthorId = @personId 
     and 
     PresenterId <> @personId 
end 

ответ

5
Select * from Event 
Where 
    (
     ((@personId is null) OR (PresenterId [email protected])) 
     and 
     ((@personId is null) OR (AuthorId = @personId)) 
     AND 
     (@filter = 'PandAOnly' or @filter = 'AllP' or @filter = 'AllA') 
    ) 
OR 
    (
     (PresenterId = @personId 
     Or 
     AuthorId = @personId) 
    AND (@filter = 'All') 
) 
OR 
    (
     PresenterId = @personId 
     and 
     AuthorId <> @personId 
     and 
     @fitler = 'POnly' 
) 
OR 
(
     AuthorId = @personId 
     and 
     PresenterId <> @personId 
     and 
     @fitler = 'AOnly' 
) 

ПРИМЕЧАНИЕ

я предпочел бы придерживаться хранимой процедуры, план выполнения для приведенного выше запроса будет страшно :)