+或 - 在Oracle算术中是否具有运算符优先级?

时间:2013-07-03 20:51:46

标签: oracle operator-precedence

以下作品的OPs request for an explanation提出了一个我不确定的观点。

select sysdate + (interval_difference * 1440) - sysdate
  from (select systimestamp - (systimestamp - 1) as interval_difference
          from dual )

即,加号或减号是否具有运算符优先级? The documentation1列出了运营商订单,如下所示

+----------------------------+-------------------------------------------+
| Operator                   |Operation                                  |
+------------------------------------------------------------------------+
| +, - (as unary operators)  | Identity, negation, location in hierarchy |
| , PRIOR, CONNECT_BY_ROOT   |                                           |
+----------------------------+-------------------------------------------+ 
| *, /                       | Multiplication, division                  |
+----------------------------+-------------------------------------------+
| +, - (as binary operators) | Addition, subtraction, concatenation      |
| , ||                       |                                           |
+----------------------------+-------------------------------------------+

查询一旦缩小,就会变为date + interval - date。但是,interval - date部分is invalid

操作是否有效,因为操作符优先顺序将二进制加上二进制加减去,或者因为Oracle足够聪明地知道一个操作无效而另一个操作无效(即它被日期时间/间隔算术攻击) ?

换句话说,为什么date + interval - date被执行为(date + interval) - date而不是date + (interval - date)

放置+之前的文档 - 可能被解释为暗示a确实具有优先权,但这并不能证明任何事情,并且这个操作成功的事实也可能证明某些事情,除非它在以下情况下执行是不可能的任何其他方式。

要交付的信息指向+具有优先权,但它是全部间接的。这可以证明这种或那种方式吗?

<子> 1。对于11.2但是10g和9i文档不出所料是相同的

1 个答案:

答案 0 :(得分:6)

这是因为+-都是left-associative

  • a + b + c表示(a + b) + c
  • a + b - c表示(a + b) - c
  • a - b + c表示(a - b) + c。 (和(3 - 2) + 1 != 3 - (2 + 1)。)
  • a - b - c表示(a - b) - c。 (和(3 - 2) - 1 != 3 - (2 - 1)。)

The page that you link to实际上提到了这一点:

  

Oracle在表达式中从左到右评估运算符具有相同的优先级。

虽然如果你不知道该找什么,很容易错过。)