【问题标题】:SQL Conditional WhereSQL 条件式 Where
【发布时间】:2010-09-26 02:07:55
【问题描述】:

我有一个名为 spGetOrders 的存储过程,它接受几个参数:@startdate 和 @enddate。这将查询“订单”表。表中的一列称为“ClosedDate”。如果订单尚未关闭,则此列将保留 NULL,如果已关闭,则保留日期值。我想添加一个@Closed 参数,它会取一点值。在一个简单的世界里,我可以做到..

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,这是我最后的手段,但开始看起来像答案..

请帮忙..

【问题讨论】:

    标签: sql conditional where


    【解决方案1】:

    SQL 语句:

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

    【讨论】:

    • 注意你的 AND/OR 问题 - 你需要括号!
    【解决方案2】:

    基本上,写出来。

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

    双,可以去掉

    【讨论】:

      【解决方案3】:

      或者这个:

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

      您似乎想要两个日期之间的所有订单,但它们的收盘信息不一致。其他建议可能一样好(或更好),但我很确定这可行并且对我来说是可读的(大多数其他建议在我打字时出现)。

      祝你好运!

      【讨论】:

        【解决方案4】:

        试试这个:

        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 时要小心谨慎。这样做时,控制评估顺序的括号非常重要。

        【讨论】:

        • 这是解决此问题的好方法。感谢您提供这种方法!
        猜你喜欢
        • 1970-01-01
        • 2016-04-12
        • 1970-01-01
        • 2022-01-19
        • 2022-01-14
        • 2013-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多