1

例子:

select count(*) from my table
where
column1 is not null
and
(column1 = 4 OR column1 = 5)

示例 2:

select count(*) from my table
where
column1 is not null
and
column1 = 4 OR column1 = 5

在具有真实列名的数据库中,我得到两个不同的结果。带括号的那个是正确的,因为如果我这样做:

select count(*) from my table
where
column1 is not null
and
column1 = 4

进而

select count(*) from my table
where
column1 is not null
and
column1 = 5

并将它们加在一起,我得到了正确的答案......我想。与上面括号的第一个示例相同。

为什么我通过改变 OR 测试的优先级得到不同的结果?

4

3 回答 3

10

它不是 Oracle 或 SQL。这是基本的布尔逻辑。AND 条件比 OR“更强”(优先),这意味着它将首先被评估:

column1 is not null
and
column1 = 4 OR column1 = 5

方法

column1 is not null
and
column1 = 4

首先评估,然后在这和之间应用 ORcolumn1 = 5

添加括号可确保先评估 OR,然后再评估 AND。

和数学很像:

2 * 3 + 5 = 6 + 5 = 11

2 * (3 + 5) = 2 * 8 = 16

更多阅读:http: //msdn.microsoft.com/en-us/library/ms190276.aspx

于 2012-04-05T19:14:14.367 回答
3

这归结为您的表达式是否被解析为:

(column1 is not null and column1 = 4) OR column1 = 5

或者

column1 is not null and (column1 = 4 OR column1 = 5)

看到不同?

于 2012-04-05T19:12:59.453 回答
2

括号很重要,(A AND B) OR CA AND (B OR C) 就像数学一样:(0 * 1) + 20 * (1 + 2)

但是,您可以选择不使用括号:SQL 没有运算符优先级规则,因此它严格地从左到右计算表达式。例如:

true OR false AND false

是假的,就像

(true OR false) AND false

尽管

true OR (false AND false)

是真的。

于 2020-05-04T15:13:21.440 回答