2015-06-08 19 views
6

Ho una tabella degli eventi che ha un campo autore e un campo relatore. Una persona dalla mia tabella personale può essere sia un autore che un presentatore dello stesso evento o possono essere il presentatore o l'autore. Ho bisogno di applicare filtri al set di risultati in base all'ID della persona e al tipo o al filtro che hanno selezionato. I filtri che ho sono:Istruzione SQL Select Dove

Tutti: restituisce tutti i record in cui sono o un autore o un presentatore.

AllPresenter: tutti i record come presentatore.

AllAutore: tutti i record come autore.

PresenterSolo: registra solo come presentatore e non autore.

AuthorOnly: registra solo come autore e non presentatore.

PresenterAndAuthorOnly: tutti i record in cui sono il presentatore e l'autore.

Attualmente ho un proc memorizzato che utilizza ifs esterni come quello di seguito e ho cercato di trovare un modo per combinare tutte queste istruzioni select simili in uno. Non ho avuto molta fortuna a trovare una soluzione migliore e mi chiedo se mi manca una tecnica.

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 

risposta

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

NOTA

avrei preferito attenersi alla stored procedure, il piano di esecuzione per la query di cui sopra sarà spaventoso :)