我在查找SQL中布尔谓词的评估顺序时遇到了麻烦。
考虑我们(假想的)汽车数据库的以下选择谓词:
WHERE
make='Honda' AND model='Accord' OR make='VW' AND model='Golf';
我知道AND优先于OR,但是我很困惑,如果这个表达式的评估如下:
((make='Honda' AND model='Accord') OR make='VW') AND model='Golf';
或作为:
(make='Honda' AND model='Accord') OR (make='VW' AND model='Golf');
或者完全不同的东西?!
非常感谢你的帮助。
答案 0 :(得分:1)
如果您不确定评估顺序(我也是,顺便说一下),您总是可以根据需要设置括号。所以你自己“定义”你的评估顺序,即使sql解释器改变了它的评估行为,结果仍然是相同的。
我知道这并没有真正回答你的问题,但为什么要考虑评估顺序,如果你可以自己使用()来定义它?
答案 1 :(得分:1)
我相信订单将是
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中AND
优先于OR
编辑:是的,条件从左到右也有优先权,但这与订单相同:
SELECT * FROM YourTable
ORDER BY col1 DESC,
col2 ASC,
col3 DESC
这里col1首先获得presendence,然后是col2,然后是col 3.同样适用于我们的situtation,首先是AND over OR
,第二个是LEFT to RIGHT
答案 2 :(得分:1)
这应该像
一样进行评估WHERE
(make='Honda' AND model='Accord' ) OR (make='VW' AND model='Golf');
说明:在SQL server AND
has precedence over OR
中,您可以想象AND部分在括号内并首先进行评估,然后进行评估OR
基于您的评论的详细信息
并且对OR有所了解,这是我在帖子中已经提到的。这个优先级是Left tor Right,因此仍然不清楚这里发生了哪个评估顺序:((make ='Honda'AND model ='Accord')或make ='VW')AND model ='Golf';或(make ='Honda'AND model ='Accord')或(make ='VW'AND model ='Golf'); -
L2R解析
WHERE (make='Honda' AND model='Accord') OR make='VW' AND model='Golf';
因为首先是所有的AND和最左边的
WHERE
{RESULT1 {1}} 因为首先是所有的ANDs
OR (make='VW' AND model='Golf');
{RESULT1 {1}} {RESULT2 {1}} 最后OR
R2L解析
WHERE
因为首先是所有的AND和最右边的AND
OR
{RESULT1 {1}} 因为首先所有AND都超过OR
;
{RESULT2 {1}} {RESULT1 {1}} 最后OR
因此,在这两种情况下,条件评估为
WHERE make='Honda' AND model='Accord' OR (make='VW' AND model='Golf');
所以我评估了以下查询中的所有三个表达式
WHERE (make='Honda' AND model='Accord') OR
结果显示;
始终为WHERE
,证明它被评估为
OR
<强> See sqlfiddle demo 强>
答案 3 :(得分:0)
我对上面回答的人的第二个想法。由于AND优先于OR,因此应首先评估所有AND表达式,然后使用OR评估其结果,即它应该是
(make='Honda' AND model='Accord') OR (make='VW' AND model='Golf')