2008-12-09 11 views
8

Mam procedurę składowaną o nazwie spGetOrders, która akceptuje kilka parametrów: @startdate i @enddate. To powoduje zapytanie do tabeli "Zamówienia". Jedna z kolumn w tabeli nosi nazwę "ClosedDate". Ta kolumna będzie mieć wartość NULL, jeśli zamówienie nie zostało zamknięte lub wartość daty, jeśli ma. Chciałbym dodać parametr @Closed, który zajmie trochę wartości. W prostym świecie, byłbym w stanie to zrobić ..SQL Conditional Where

select * from orders o 
where o.orderdate between @startdate AND @enddate 
and (if @Closed = 1 then o.ClosedDate IS NULL else o.ClosedDate IS NOT NULL) 

Oczywiście, że nie będzie działać .. Jestem również patrząc na dynamiczny SQL, który jest moja ostatnia deska ratunku, ale zaczyna wyglądać Oświadczenie odpowiedź ..

Proszę o pomoc ..

Odpowiedz

14

Spróbuj tego:

select * from orders o 
where o.orderdate between @startdate AND @enddate 
and ((@Closed = 1 And o.ClosedDate IS NULL) Or (@Closed = 0 And o.ClosedDate IS NOT NULL)) 

Należy zachować ostrożność w przypadku mieszania klauzul ORAZ OR w klauzuli where. W tym przypadku bardzo ważny jest nawias do kontroli kolejności oceny.

+1

To jest świetny sposób, aby rozwiązać ten problem. Dzięki za to podejście! – Noah

2

SQL:

SELECT * 
FROM orders 
WHERE orderdate BETWEEN @startdate AND @enddate 
AND (@Closed = 1 OR CLosedDate IS NOT NULL) 
+1

Uważaj na firmy i/lub kwestii - trzeba nawiasów! –

0

Albo to:

select * from orders o 
where o.orderdate between @startdate AND @enddate 
and ( (@Closed = 1 AND o.ClosedDate IS NULL) 
    OR (ISNULL(@Closed, 0) <> 1 AND o.ClosedDate IS NOT NULL) 
    ) 

Wygląda jak chcesz wszystkie rozkazy pomiędzy dwiema datami, które mają niespójne Zamknij informacje. Inne sugestie są prawdopodobnie równie dobre (lub lepsze), ale jestem prawie pewien, że to działa i jest dla mnie czytelne (większość innych sugestii pojawiła się podczas pisania).

Powodzenia!

0

Zasadniczo, zapisz to.

select * from orders o 
where o.orderdate between @startdate AND @enddate 
and ((@Closed = 1 and o.ClosedDate IS NULL) 
    or (@Closed != 1 and o.ClosedDate IS NOT NULL)) 

podwójne, mogą być usunięte