我有一个TextBox和两个DropDownLists,用于搜索功能。两个DropDownLists从我的DB('Product_Rental'和'Range_Name')的'Products'表中的列中获取它们的值。它们可以相互结合使用,因此如果选择了Range_Name,您仍然可以选择Product_Rental(租赁价格范围)DropDownList来进一步缩小搜索范围。这些将通过QueryString传递到一个单独的页面,其中GridView显示结果。
我的问题是,在SQL语句中执行此操作的最佳方法是什么?我假设我需要某种条件语句,例如,如果找到'Range_Name'查询的结果,则仅使用'Product_Rental'查询。
在做了一些挖掘后,看起来我需要使用CASE语句,但我不确定如何。
这是我到目前为止所拥有的:
SELECT Product_Rental, Product_ID, Range_Name, Model_Name, Product_Name, Product_Year, Product_Code, Product_Active, Product_DateAdded
FROM Products
WHERE (Range_Name LIKE '%' + @Range_Name + '%') OR
(Model_Name LIKE '%' + @Model_Name + '%') OR
(Product_Name LIKE '%' + @Product_Name + '%') OR
(Product_Code LIKE '%' + @Product_Code + '%') OR
(Product_Year LIKE '%' + @Product_Year + '%') OR
(CONVERT(float, Product_Rental) BETWEEN CONVERT(float, @Product_Rental) AND CONVERT(float, @Product_Rental) + 50)
非常感谢任何帮助。
答案 0 :(得分:0)
假设变量的默认值是空字符串,那么您只需将or
更改为and
(并修复浮点比较):
SELECT Product_Rental, Product_ID, Range_Name, Model_Name, Product_Name, Product_Year, Product_Code, Product_Active, Product_DateAdded
FROM Products
WHERE (Range_Name LIKE '%' + @Range_Name + '%') AND
(Model_Name LIKE '%' + @Model_Name + '%') AND
(Product_Name LIKE '%' + @Product_Name + '%') AND
(Product_Code LIKE '%' + @Product_Code + '%') AND
(Product_Year LIKE '%' + @Product_Year + '%') AND
((CONVERT(float, Product_Rental) BETWEEN CONVERT(float, @Product_Rental) AND CONVERT(float, @Product_Rental) + 50) or @Product_Rental = '')
答案 1 :(得分:0)
因此,我假设您在实际将@values提交到SQL查询之前,将“清理”您的入站参数并在其控制之下。也就是说,始终提供各自数据类型期望的所有标准...字符串,整数,日期等等。
然后,在您的查询中,根据需要应用OR。
从方案1开始,只提供范围而没有其他模型,名称,年份等
@Range = "something" (however comes in from .aspx)
@model = "-"
@name = "-"
@year = -1
etc..
现在是WHERE子句
where
Range_Name LIKE '%' + @Range + '%')
AND (@model = "-" OR Model_Name like '%' + @model + '%')
AND (@name = "-" OR Product_Name LIKE '%' + @name + '%')
AND (@year = -1 OR Product_Year = @year )
所以,想一想它将如何处理......总是根据类似的限定符来限定范围。然后,对于其他每个OPTIONAL标准,我将它们默认为“用户没有输入值”......我分别使用 - 和-1。
现在,当AND被应用于那些可选的那些时,由于每个OPTIONAL都在它自己的(具有OR条件的parens),如果第一部分为真,它认为它是好的并忽略条件的第二部分
所以当@model默认为“ - ”时,AND说...如果model =“ - ”,是的,我们很好,忽略了这个paren组的其余LIKE比较。其余部分也一样。
现在,您将获得另一个带有范围和YEAR值的查询(例如)。您需要分配的唯一真正价值是@year说... 2013.那么where子句的部分被评估为
AND ( @year = -1 OR Product_Year = @year )
@year = -1失败,因此它会通过并检查product_year = 2013并确认它是否符合条件。
这样,您可以将所有条件预先构建到WHERE中,并且每个单独的可以传递,它将被测试或绕过(通过左侧OR限定符)允许返回的行。
答案 2 :(得分:0)
我认为这就是你所追求的:
Use Northwind
GO
declare @ProductNameLikeFilter varchar(64)
declare @QuantityPerUnitLikeFilter varchar(64)
select @ProductNameLikeFilter = 'ge'
select @QuantityPerUnitLikeFilter = 'g'
select
*
from
dbo.[Products] prods
where
( @ProductNameLikeFilter IS NULL OR prods.ProductName like '%' + @ProductNameLikeFilter + '%' )
and
( @QuantityPerUnitLikeFilter IS NULL OR prods.QuantityPerUnit like '%' + @QuantityPerUnitLikeFilter + '%' )
select @ProductNameLikeFilter = NULL
select @QuantityPerUnitLikeFilter = NULL
select
*
from
dbo.[Products] prods
where
( @ProductNameLikeFilter IS NULL OR prods.ProductName like '%' + @ProductNameLikeFilter + '%' )
and
( @QuantityPerUnitLikeFilter IS NULL OR prods.QuantityPerUnit like '%' + @QuantityPerUnitLikeFilter + '%' )