2012-07-19 39 views
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 '') ) 

回答

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

使用'NULL'来指示未指定的值可能会有帮助。空串可以是适当的值,例如我想找到'ShippingNotes'为空的简单订单。 – HABO 2012-07-19 01:07:57

+0

是的'NULL'会造成一些复杂的事情,但是在读入OP时,我发现他正在使用空字符串。如果OP想要将'NULL'传递到命令中,那么你简单地将'@Variable ='''改成'@Variable IS NULL',其余的都是一样的。当然,在另一方面,您可能需要隔离NULL记录。在这种情况下,where子句将类似于COALESCE(@Variable,'dummystring')= COALESCE(FieldName,'dummystring')' – Malk 2012-07-19 17:44:35

0

看看这个完整article从厄兰,特别是标题为“Umachandar's Bag of Tricks

还要检查从上述文章中Implementing a Dynamic WHERE Clause

提取物展示了如何使用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) 
0

这是一个非常简单的查询
声明@OrderNumber INT = NULL
SELECT * FROM dbo.Orders
WHERE
(@OrderNumber为空或(订单编号IS NOT NULL和订单号码IN(@OrderNumber)))
AND((OrderDate BETWEEN'2010-01-01'AND'2012-10-10')OR(OrderDate BETWEEN'and AND''))

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

+0

忘记提及@ordernumber是传递的order号 – 2012-07-19 07:11:45