2013-07-03 84 views
-2

以下作品的OPs request for an explanation拋出了一個我不確定的觀點。在ORACLE算法中,+或者具有運算符優先級嗎?

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文檔,勿庸置疑,相同

回答

6

這是因爲+-均爲left-associative

  • a + b + c表示​​8566042208。
  • 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實際上提到了這一點:

甲骨文評估經營者具有相同的優先級,從左至右在表達式中

雖然它很容易,如果你錯過。不知道該找什麼。)

+1

現在我覺得很蠢:-)。不記得基本的數學...是的,只是重新閱讀文檔,並看到它:-(。謝謝! – Ben

+3

奇怪的[PL/SQL等價物](http://docs.oracle.com/cd/E11882_01/ appdev.112/e25519/fundamentals.htm#sthref127)表示'具有相同優先級的運算符不以特定順序評估' –

+0

@AlexPoole:瘋狂!你認爲他們真的是這個意思嗎? – ruakh