使用OR进行短路

时间:2014-04-08 05:16:42

标签: sql sql-server sql-server-2008

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)

抱歉有困难的家伙

2 个答案:

答案 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))