2008-12-09 61 views
8

我有一個名爲spGetOrders的存儲過程,它接受幾個參數:@startdate和@enddate。這將查詢「訂單」表。表格中的其中一列稱爲「ClosedDate」。如果訂單尚未關閉,則該列將保留NULL,如果已有,則該列將保留日期值。我想添加一個@Closed參數,這將需要一些值。在一個簡單的世界裏,我能夠做到..SQL有條件的地方

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) 

很顯然,這是行不通的..我也期待在動態SQL這是我最後的手段,而是開始看起來像答案..

請幫助..

回答

14

試試這個:

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

對where子句中AND與OR的混合情況要小心謹慎。當這樣做時,控制評估順序的括號非常重要。

+1

這是解決此問題的好方法。感謝這種方法! – Noah 2009-04-02 16:15:55

2

SQL語句:

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

當心你的AND/OR問題 - 你需要括號! – 2008-12-09 16:50:02

0

或者這樣:

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

它看起來像你希望所有有不一致的關閉信息兩個日期之間的訂單。其他建議可能是一樣好(或更好),但我很確定這是有效的,並且對我來說是可讀的(大部分其他建議都是在我輸入時出現的)。

祝你好運!

0

基本上寫出來。

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

雙,可以去掉