我有一个订单搜索页面,用户可以在其中输入任何搜索条件并提交。 如果点击提交而未输入任何标准,我们应该显示所有订单。 如果用户输入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 :(得分:0)
如果字段没有值,则无法检查字段是否具有值AND。无论如何,您将始终获得所有记录。您需要将值拉出到变量中。除非你正在编写动态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)
答案 1 :(得分:0)
查看Erland的完整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)
答案 2 :(得分: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'和'2012-10-10')或(OrderDate BETWEEN''AND''))
虽然这个查询很简单但是这里有解释:如果@ordernumber为null,那么它将显示所有记录,而对于另一种情况,它将只显示与传递的orderid相对应的记录。