DECLARE @from_marked_price DECIMAL(18, 2), @to_marked_price DECIMAL(18, 2)
SELECT @from_marked_price = 3000
我有一个像这样的过滤器
WHERE
@to_marked_price IS NOT NULL
OR @from_marked_price IS NULL
OR pd.marked_price >= @from_marked_price
然而,我没有像
那样得到期望的结果WHERE pd.marked_price >= 3000
我在这里做错了吗?
我可以使用动态sql来做,但想知道这里有什么问题
其实我得到了答案 我有多个问题,比如
WHERE
@to_marked_price IS NOT NULL OR @from_marked_price IS NULL OR pd.marked_price >= @from_marked_price
AND @from_marked_price IS NOT NULL OR @to_marked_price IS NULL OR pd.marked_price <= @to_marked_price
所以我在这里做的错误是我没有正确放置括号,它应该是
WHERE
(@to_marked_price IS NOT NULL OR @from_marked_price IS NULL OR pd.marked_price >= @from_marked_price)
AND (@from_marked_price IS NOT NULL OR @to_marked_price IS NULL OR pd.marked_price <= @to_marked_price)
抱歉有困难的家伙
答案 0 :(得分:1)
我知道你已经回答了你的问题(把括号放在正确的位置)但是为了完整,答案是
“除非使用CASE语句,否则不能使表达式短路。”
这就是为什么
WHERE x<>0 and (100/x)>y
类型的查询仍然可以将div赋予零和
WHERE
CASE WHEN X=0 then NULL -- or whatever
ELSE (100/x) end
>y
不会。
答案 1 :(得分:-1)
Try this ...
Select * from sometable
WHERE
@to_marked_price IS NOT NULL
OR ((@from_marked_price IS NULL) OR (pd.marked_price >= @from_marked_price))