Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中布尔表达式的求值顺序_Sql - Fatal编程技术网

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

我在计算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='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
  • 最后还是

    R2L解析

  • 其中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