SQL中布尔表达式的求值顺序
我在计算SQL中布尔谓词的求值顺序时遇到困难 考虑我们(想象的)汽车数据库上的以下选择谓词:SQL中布尔表达式的求值顺序,sql,Sql,我在计算SQL中布尔谓词的求值顺序时遇到困难 考虑我们(想象的)汽车数据库上的以下选择谓词: WHERE make='Honda' AND model='Accord' OR make='VW' AND model='Golf'; 我知道这一点,并且优先于或,但是我不知道这个表达式是否会按如下方式计算: ((make='Honda' AND model='Accord') OR make='VW') AND model='Golf'; 或作为: (make='Honda' AND model
WHERE
make='Honda' AND model='Accord' OR make='VW' AND model='Golf';
我知道这一点,并且优先于或,但是我不知道这个表达式是否会按如下方式计算:
((make='Honda' AND model='Accord') OR make='VW') AND model='Golf';
或作为:
(make='Honda' AND model='Accord') OR (make='VW' AND model='Golf');
或者完全不同的东西
非常感谢您的帮助。如果您不确定评估顺序(顺便说一句,我也是),您可以根据需要设置括号。因此,您可以自己“定义”求值顺序,即使sql解释器更改其求值行为,结果仍然是一样的
我知道这并不能真正回答您的问题,但如果您可以使用(),自己定义评估顺序,那么为什么还要麻烦评估顺序呢?我相信评估顺序是正确的
WHERE
make='Honda' AND model='Accord' OR make='VW' AND model='Golf';
1) make = 'Honda' and model = 'Accord'
2) Or make = 'VW' AND model = 'Golf'
这意味着:
(make='Honda' AND model='Accord') OR (make='VW' AND model='Golf');
这是因为在大多数DBMS中,和
比或
占上风
编辑:是,条件也具有从左到右的优先级,但这与排序依据相同:
SELECT * FROM YourTable
ORDER BY col1 DESC,
col2 ASC,
col3 DESC
这里col1首先得到presentendence,然后是col2,然后是col3。我们的情况也是如此,第一个presence是
和over或
,第二个presence是从左到右
这应该像
WHERE
(make='Honda' AND model='Accord' ) OR (make='VW' AND model='Golf');
说明:在SQL server中,因此您可以想象和部分位于括号内,并在它们之前和之后进行计算,或者
详细信息基于您的评论
我已经在我的帖子里提到过了。这种优先顺序是从左到右,因此仍不清楚此处的评估顺序:((make='Honda'和model='Accord')或make='VW')和model='Golf';或者(制造本田和雅阁)或者(制造大众和高尔夫);-
L2R解析
WHERE(make='Honda'和model='Accord')或make='VW'和model='Golf'代码>
其中
result1或(make='VW'和model='Golf')代码>
其中
result1或
result2代码>
其中make='Honda'和model='Accord'或(make='VW'和model='Golf')代码>
WHERE(make='Honda'和model='Accord')或result1代码>
其中
result2或
result1代码>
WHERE
(make='Honda' AND model='Accord' ) OR (make='VW' AND model='Golf');
所以我在下面的查询中计算了所有三个表达式
-- create table t(make varchar(100), model varchar(100))
-- insert into t values ('Honda','Golf'),('Honda','Accord'),('VW','Golf'),('VW','Accord')
select *,
case when make='Honda' AND model='Accord' OR make='VW' AND model='Golf' then 1 else 0 end as result,
case when (make='Honda' AND model='Accord') OR (make='VW' AND model='Golf') then 1 else 0 end as result1,
case when ((make='Honda' AND model='Accord') OR make='VW' ) AND model='Golf' then 1 else 0 end as result2
from t
;
并且结果始终显示result=result1
,证明其评估为
WHERE
(make='Honda' AND model='Accord' ) OR (make='VW' AND model='Golf');
我想起了上面回答的人。由于AND优先于OR,因此应首先计算所有AND表达式,然后使用OR计算其结果,即
(make='Honda' AND model='Accord') OR (make='VW' AND model='Golf')
但实际的顺序是什么呢?我已经在我的问题中提到过了。这一优先顺序是从左到右,但仍不清楚此处的评估顺序是:(make='Honda'和model='Accord')还是make='VW')和model='Golf';或(制造“本田”和“雅阁”车型)或(制造“大众”和“高尔夫”车型);L2R或R2L在这里并不重要。看我的最新答案,我已经处理了L2R和R2L两种情况。但优先级不是留给righ吗?因此,给出的评估顺序为:((make='Honda'和model='Accord')或make='VW')和model='Golf'?我删除了无关的数据库标签。
和
绑定得更紧密,因此请遍历表达式,查找和
并在紧邻它们的操作数周围加上括号。这就是它的计算方法。只要想想*
(乘法)而不是和,+
(加法)而不是或。您可以很容易地知道如何计算2*3+4*5
。