SQL中布尔表达式的评估顺序

时间:2016-04-13 10:29:05

标签: sql

我在查找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');

或者完全不同的东西?!

非常感谢你的帮助。

4 个答案:

答案 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解析

  1. WHERE (make='Honda' AND model='Accord') OR make='VW' AND model='Golf';
  2. 因为首先是所有的AND和最左边的

    1. WHERE {RESULT1 {1}}
    2. 因为首先是所有的ANDs

      1. OR (make='VW' AND model='Golf'); {RESULT1 {1}} {RESULT2 {1}}
      2. 最后OR

        R2L解析

        1. WHERE
        2. 因为首先是所有的AND和最右边的AND

          1. OR {RESULT1 {1}}
          2. 因为首先所有AND都超过OR

            1. ; {RESULT2 {1}} {RESULT1 {1}}
            2. 最后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')