2008-12-09 62 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)) 

双,可以去掉