Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 在SQL中的WHERE语句中使用条件语句(CASE)_Asp.net_Sql_Sql Server - Fatal编程技术网

Asp.net 在SQL中的WHERE语句中使用条件语句(CASE)

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

我有一个文本框和两个下拉列表,用于搜索功能。这两个DropDownLists的值来自my DB中“Products”表中的列(“Product_Rental”和“Range_Name”)。它们可以相互结合使用,因此如果选择了范围\名称,您仍然可以选择产品\租赁(租赁价格范围)下拉列表以进一步缩小搜索范围。这些内容将通过查询字符串传递到一个单独的页面,该页面具有显示结果的GridView

我的问题是,在SQL语句中执行此操作的最佳方法是什么?我假设我需要某种条件语句,例如,如果“Range\u Name”查询有结果,则只使用“Product\u rent”查询

在做了一些挖掘之后,看起来我需要使用案例陈述,但我不确定如何使用

以下是我目前掌握的情况:



    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 + '%' )