Asp.net 在SQL中的WHERE语句中使用条件语句(CASE)
我有一个文本框和两个下拉列表,用于搜索功能。这两个DropDownLists的值来自my DB中“Products”表中的列(“Product_Rental”和“Range_Name”)。它们可以相互结合使用,因此如果选择了范围\名称,您仍然可以选择产品\租赁(租赁价格范围)下拉列表以进一步缩小搜索范围。这些内容将通过查询字符串传递到一个单独的页面,该页面具有显示结果的GridView 我的问题是,在SQL语句中执行此操作的最佳方法是什么?我假设我需要某种条件语句,例如,如果“Range\u Name”查询有结果,则只使用“Product\u rent”查询 在做了一些挖掘之后,看起来我需要使用案例陈述,但我不确定如何使用 以下是我目前掌握的情况:Asp.net 在SQL中的WHERE语句中使用条件语句(CASE),asp.net,sql,sql-server,Asp.net,Sql,Sql Server,我有一个文本框和两个下拉列表,用于搜索功能。这两个DropDownLists的值来自my DB中“Products”表中的列(“Product_Rental”和“Range_Name”)。它们可以相互结合使用,因此如果选择了范围\名称,您仍然可以选择产品\租赁(租赁价格范围)下拉列表以进一步缩小搜索范围。这些内容将通过查询字符串传递到一个单独的页面,该页面具有显示结果的GridView 我的问题是,在SQL语句中执行此操作的最佳方法是什么?我假设我需要某种条件语句,例如,如果“Range\u N
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)
任何帮助都将不胜感激。假设变量的默认值是空字符串,那么您只需将
或更改为和
(并修复浮点比较):
因此,我假设您将“清理”入站参数,并在实际向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 )
所以,想想它将如何被处理。。。始终根据like限定符限定范围。然后,对于其他每个可选条件,我都将它们默认为“用户未输入值”。。。我分别使用了-1和-1
现在,当AND应用于这些可选项时,由于每个可选项都有它自己的(带有OR条件的parens),如果第一部分为true,则认为它是ok,并忽略条件的第二部分
所以当@model默认为“-”时,和表示。。。如果model=“-”,是的,我们很好,忽略这个paren组的其他类似比较。其余的也一样
现在,您将获得另一个查询,其中包含范围和年份值(例如)。您需要指定的唯一实际值是@year,表示。。。2013那么where子句的该部分被评估为
AND ( @year = -1 OR Product_Year = @year )
@year=-1失败,因此它将通过检查产品_year=2013,并确认其是否符合标准
通过这种方式,您可以将所有标准预构建到WHERE中,并且由于每个标准都可能通过,因此将对其进行测试或绕过(通过左侧或限定符)以允许返回行。我认为这就是您所追求的:
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 + '%' )
谢谢你的快速回复。我试过了,但似乎没用。也许我需要解释更多。因此,按照我的设置方式,当两个下拉列表都被选中时,我的搜索功能将返回一个URL-“SearchResults.aspx?range=A3”(如果只选择了“range_Name”),以及类似“SearchResults.aspx?range=A3&price=200”的内容。使用我的SQL查询,它们可以单独工作,但不能一起工作。谢谢你的帮助。我尝试了你的方法,但遇到了一些问题。我能问一下。。。在顶部代码块中,这是select语句吗?如果是这样的话,我必须先声明这些吗?@hewsy10,我怀疑您正在准备(at)变量的顶部代码块,在清理传入asp.net请求的过程中。这些将是调用实际SQL语句时的参数值。我刚刚更新了WHERE子句根据提供的值(或不提供)的外观。您好,谢谢。我正在使用.xsd DataTableAdapter生成SQL查询,并且不断收到一个错误,即不支持DECLARE语句。这取决于我的SQL server吗?看起来我使用的是SQL 2005。我不知道您使用的是内联SQL。否,declare语句用于存储过程。这个答案对你没有帮助。
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 + '%' )