2008-12-09 31 views
8

Bazı parametreleri kabul eden spGetOrders adlı bir Kayıtlı Yordamım var: @startdate ve @enddate. Bu bir "Siparişler" tablosunu sorgular. Tablodaki sütunlardan birine "ClosedDate" denir. Bir sipariş kapatılmadıysa veya bir tarih değeri varsa, bu sütun NULL tutar. Ben bir bit değeri alacak bir @Closed parametresi eklemek istiyorum. Basit bir dünyada, yapmam mümkün olurdu .. Açıkçası SQL Koşullu Olduğu Durum

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) 

, ben de benim son çare dinamik sql bakıyorum .. işe ancak benzemeye başladı değil cevap ..

Lütfen yardım

..

cevap

14

bu deneyin:

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)) 
.01.

AND'leri ve OR'leri nerede eklediğinizde karıştırmaya dikkat edin. Bunu yaparken, değerlendirme sırasını kontrol etmek için parantez çok önemlidir.

+1

Bu, bu sorunu gidermek için harika bir yoldur. Bu yaklaşım için teşekkürler! – Noah

2

SQL Bildirimi:

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

sizin VE/VEYA konularda dikkat kaldırılabilir! –

0

Ya da bu: tutarsız Kapat bilgiye sahip iki tarih arasındaki tüm siparişler istedikleri gibi

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

görünüyor. Diğer öneriler muhtemelen iyi (ya da daha iyisi) ama bu işin bana ve bana göre okunabileceğine eminim (yazdığım gibi diğer önerilerin çoğu ortaya çıktı).

İyi şanslar!

0

Temel olarak, yazınız. Eğer parantez gerek -

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

çift,