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

时间:2013-12-05 16:40:41

标签: asp.net sql sql-server

我有一个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)

非常感谢任何帮助。

3 个答案:

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