我有一个充满产品的表格,之前我们将MaxPrice
和MinPrice
传递给存储过程和选定的产品,价格介于两个值之间。
但现在我想传递多个范围值,并希望选择价格介于多个范围之间的产品。
假设我有一个这样的存储过程:
@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 :(得分: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
优于>
和<
声明,在这种情况下,如果您的价格范围是包含性的,即如果您确实需要&lt; =和&gt; =;并且JOIN
比多个WHERE
条款
请注意,BETWEEN相当于&lt; =,&gt; =的简写,而不是&lt;,&gt;