2012-11-01 11 views
10

Mam zapytanie jak:SQL Server z unii Jeśli stan

DECLARE @tmpValue 
SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1 
UNION 
IF @tmpValue > 0 
SELECT * FROM Animal WHERE.Active = 0 

Gdy używam tak to daje błąd, ponieważ od tego, czy warunek. Muszę używać UNION ze względu na naszą strukturę.

W jaki sposób można z niego korzystać, jeśli jest spełniony warunek?

Dzięki,
John

Odpowiedz

14

Przenieś warunek @tmpValue > 0 klauzuli WHERE tak:

SELECT * FROM Animal WHERE AniActive = 1 
UNION 
SELECT * FROM Animal WHERE @tmpValue > 0 AND Active = 0 
3

Można dodać warunek do zapytania takiego. część sekcji związku po prostu nie zwróci żadnych wyników, jeśli twój warunek testowy jest fałszywy:

DECLARE @tmpValue 

SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1 
UNION 
SELECT * FROM Animal WHERE.Active = 0 and @tmpValue > 0 
3

Najlepszym sposobem postawienia warunku w Zapytaniu jest instrukcja CASE. możesz umieścić dowolną liczbę warunku w zapytaniu. Instrukcja CASE służy do umieszczania filtrów warunkowych w Zapytaniu.

Dla EX.

DECLARE @tmpValue 
SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1 
UNION 
SELECT * FROM Animal 
WHERE 
1 = CASE WHEN @tmpValue = 0 THEN 0 ELSE Active = 1 END 

Twoja sytuacja nie jest skomplikowana, ale dla bardziej złożonego stanu można użyć zagnieżdżonej instrukcji CASE w Zapytaniu.

0

Oto sposób na uproszczenie kodu poprzez całkowite pozbycie się UNION. W miarę możliwości zawsze preferuję prostsze rozwiązanie. Będzie to również działać lepiej, jeśli zaznaczenie wykona skanowanie tabeli, ponieważ skanuje ono tylko raz, a nie (potencjalnie) dwa razy.

DECLARE @tmpValue 

SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1 OR @tmpValue > 0