以下作品的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文档不出所料是相同的
答案 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在表达式中从左到右评估运算符具有相同的优先级。
虽然如果你不知道该找什么,很容易错过。)