簡體   English   中英

在SQL的WHERE語句中使用條件語句(CASE)

[英]Using conditional statement (CASE) within a WHERE statement in SQL

我有一個TextBox和兩個DropDownLists,用於搜索功能。 這兩個DropDownLists從我數據庫的“產品”表中的列(“ Product_Rental”和“ Range_Name”)中獲取值。 它們可以相互結合使用,因此,如果選擇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)

任何幫助將不勝感激。

假設變量的默認值為空字符串,則只需將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 = '')

因此,我假設您在實際將@values提交給sql查詢之前,將“清理”入站參數並控制它們。 也就是說,請始終提供其各自數據類型期望的所有條件...字符串,整數,日期等。

然后,在查詢中,根據需要應用OR。

從方案1開始,方案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 ) 

因此,請考慮如何處理...始終根據類似的限定詞來限定范圍。 然后,對於其他每個可選條件,我默認將它們默認為“用戶未輸入值” ...我分別使用-和-1。

現在,當將AND應用於這些OPTIONAL時,由於每個OPTIONAL都是自己的(具有OR條件的條件),因此如果第一部分為true,則它將其視為正常,而忽略該條件的第二部分。

因此,當@model默認為“-”時,AND表示...如果model =“-”,是的,我們很好,請忽略此paren組的其余LIKE比較。 其余的也一樣。

現在,您將獲得另一個查詢,例如帶有范圍和YEAR值的查詢。 您需要分配的唯一實際值是@year說...2013。那么where子句的那部分被評估為

AND ( @year = -1 OR Product_Year = @year )

@year = -1失敗,因此它失敗了,並檢查product_year = 2013,並確認它是否符合條件。

這樣,您可以將所有條件預先構建到WHERE中,並且可以通過每個條件時,將對其進行測試或忽略(通過左側OR限定符)是否允許返回行。

我認為這是您追求的目標:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM