2017-07-15 72 views
2

我有一張滿載產品的表,之前我們將MaxPriceMinPrice傳遞給存儲過程和兩個值之間的價格的選定產品。將語句之間的倍數傳遞到存儲過程

但現在我想通過多個範圍值,並希望選擇他們的價格在多個範圍之間的產品。

比方說,我有這樣一個存儲過程:

@PriceMin decimal(18, 4) = null, 
@PriceMax decimal(18, 4) = null, 

... 
WHERE 
    product.Price > @PriceMin 
    AND product.Price < @PriceMax 

,但現在我想通過基於用戶選擇值的多個範圍,並有選擇這樣的:

WHERE 
    (product.Price > @PriceMin1 AND product.Price < @PriceMax1) 
    OR (product.Price > @PriceMin2 AND product.Price < @PriceMax2) 
    OR (product.Price > @PriceMin3 AND product.Price < @PriceMax3) 
... 

如何我可以這樣做嗎?

+0

使用動態查詢構建WHERE條款 – SQL006

回答

3

我打算假設你不知道有多少個範圍要傳遞給前端,所以我需要使用表值參數將數據傳遞給存儲過程。

步驟1:創建TVP

CREATE TYPE dbo.Ranges AS TABLE 
    (PriceMin decimal(18, 4), PriceMax decimal(18, 4)) 

第2步:修改存儲過程的參數列表和代碼

ALTER PROCEDURE usp_selectBasedOnPrice 
    (@rangeList dbo.Ranges READONLY) 
BEGIN 
.. 
-- from product 
-- WHERE product.Price > @PriceMin and product.Price < @PriceMax 

from product p JOIN @rangeList r 
on p.Price BETWEEN r.PriceMin AND r.PriceMax 
END 

PS:需要注意的是BETWEEN><更好聲明,在這種情況下,如果你的價格範圍是包容性的,即如果你真的需要< =和> =;和JOIN比多次WHERE條款

請做筆記好得多那之間,相當於短手< =,> =,而不是<,>

MS documentation on TVP

+2

爲什麼'BETWEEN'比'>'和'<'更好?(除了兩者不相等)? –

+0

我同意他們不一樣,實際上很多時候我因爲錯誤地使用了'BETWEEN'(特別是帶有日期時間參數)而一直在喝湯。我想告訴OP使用之間,而不是<, >,因爲(我猜)這個問題實際上應該使用BETWEEN(即範圍包含),而BETWEEN只是甜美和清晰的語法。 – DhruvJoshi

+0

我認爲'> ='和'<='語法更清晰。 –