2012-05-11 14 views
5

Obecnie mam przechowywane proc, który pobiera ciągShorthand IF w SQL

@vari as varchar(30) 
if @vari is null 
    SELECT * FROM TABLE 
else 
    SELECT * FROM TABLE WHERE col = @vari 
endif 

jest jakiś sposób, aby inline instrukcji if, co nie deklarujące 2 wybrać tylko dlatego od 1 param?

+0

Można również zrobić to z instrukcji case, to nie jest tak krótki, jak odpowiedzi poniżej, ale w niektórych przypadkach jest lepiej . – Purplegoldfish

+0

Nie zmieniłbym twojego kodu, ponieważ w większości przypadków sql wygeneruje znacznie lepszy plan wykonania niż połączone kryteria "lub". –

Odpowiedz

15
SELECT * FROM TABLE WHERE (@vari is null or col = @vari) 
+0

To działa, ale moje następne pytanie: dlaczego? Czy nawiasy oceniają tylko pierwsze kryteria jako prawdziwe, a następnie czy ...? – Alex

+3

@Alex: Wciąż ocenia oba kryteria, ale z powodu "lub", każdy z nich może być prawdziwy, aby wiersz mógł zostać włączony do zestawu wyników. Jeśli '@vari ma wartość null', to każdy wiersz zostanie zwrócony, ponieważ pierwsza część jest zawsze prawdziwa. W przeciwnym razie jedynymi zwracanymi wierszami będą te pasujące do drugiej części, col = @ vari', która zastosuje filtr. – mellamokb

+2

Wsporniki są tutaj, ponieważ mam nawyk umieszczania otworów w nawiasach. –

3

Zakładając col nigdy nie jest pusty, można to zrobić:

select * 
from table 
where col = isnull(@vari, col)