0

我有一个订单搜索页面,用户可以在其中输入任何搜索条件并提交。如果如果点击提交而不输入任何标准,我们应该显示所有订单。如果用户输入 orderId,我们应该只显示相应的订单。如果用户输入日期范围和状态,我们应该在所选日期范围内显示具有所选状态的订单。

我试过了,如图。

SELECT * FROM dbo.Orders
WHERE ( OrderNumber ='' OR OrderNumber ='212' )
AND ( (OrderDate BETWEEN '2010-01-01' AND '2012-10-10') 
OR (OrderDate BETWEEN '' AND '')  )
4

3 回答 3

0

您无法检查该字段是否具有该值以及该字段是否具有该值。无论如何,您将始终获得所有记录。您需要将值提取到变量中。除非你正在编写动态 SQL;如果是这种情况,那么如果您打算过滤,您只会添加到 where 子句......

DECLARE @OrderNumber VARCHAR, @StartDate VARCHAR, @EndDate VARCHAR

SET @OrderNumber = '212'
SET @StartDate = '2010-01-01'
SET @EndDate = '2012-01-01'

SELECT  * 
FROM    dbo.Orders 
WHERE   (@OrderNumber ='' OR OrderNumber = @OrderNumber) 
AND     (@StartDate = '' OR OrderDate >= @StartDate)
AND     (@EndDate = '' OR OrderDate <= @EndDate)
于 2012-07-19T00:35:48.070 回答
0

这是一个非常简单的查询
声明 @ordernumber int = null
SELECT * FROM dbo.Orders
WHERE
(@ordernumber 为 null 或 (OrderNumber IS NOT NULL AND OrderNumber IN (@ordernumber)))
AND ((OrderDate BETWEEN '2010-01-01 ' AND '2012-10-10') OR (OrderDate BETWEEN '' AND '') )

虽然这个查询很简单,但这里解释一下:如果@ordernumber 为空,那么它将显示所有记录,而对于另一种情况,它将只显示与传递的 orderid 对应的记录。

于 2012-07-19T07:06:44.117 回答
0

查看 Erland 的这篇完整文章,尤其是标题“ Umachandar 的一袋子技巧

还要检查实现动态 WHERE 子句

上述文章的摘录展示了如何利用 COALESCE 来实现这一点:

DECLARE @Cus_Name varchar(30),
                  @Cus_City varchar(30),
                  @Cus_Country varchar(30)

SET @Cus_Name = NULL
SET @Cus_City = 'Paris'
SET @Cus_Country = NULL

SELECT Cus_Name,
               Cus_City,
               Cus_Country
FROM Customers
WHERE Cus_Name = COALESCE(@Cus_Name,Cus_Name) AND
      Cus_City = COALESCE(@Cus_City,Cus_City) AND
      Cus_Country = COALESCE(@Cus_Country,Cus_Country)
于 2012-07-19T02:14:03.557 回答