2013-04-04 65 views
5

爲什麼在SQL Server中以下兩個查詢的輸出是不同的,在Oracle中是一樣的?爲什麼SQL Server中的輸出與Oracle中的輸出不同?

SELECT 20.0/-2.0/5 

SELECT 20/(-2.0)/5 
+3

什麼**是輸出,你期望什麼? – 2013-04-04 12:53:36

+0

@marc_s我在SQL Server 2008中分別得到了'-50.000000000'和'-2.00000000',但是他們都希望它們只是'-50.000000000'。 – 2013-04-04 12:59:38

+0

請注意,兩者都給-2在MySQL – 2013-04-04 13:02:59

回答

4

我不同意你的聲明輸出應該是相同的。
如果你問我什麼20/-2/5多的輸出,我會回答你,它可以輸出-2或-50,取決於實施細節。

In Oracle,你知道的唯一事情就是在'+'和' - '之前評估運算符'*'和'/'。但就是這些。我沒有發現任何有關優先權給予運營商'*'和'/'的文件。
由於這兩個查詢給出了-2,所以可以假設括號被留下,並且計算是從左到右進行的。

In SQL Server, the docs specified that

當兩個運營商在表達具有相同的運算符的優先級 ,它們從左向右計算基於它們在 表達位置。

所以這個計算是符合規格:

20/2/5 = (20/2)/5 = 2 

現在添加減號

20/-2/5 = 20/(-2/5) = -50 

添加括號再次

20/(-2)/5 = (20/-2)/5 = -2 

這樣不僅括號變化訂單,但減號。

事實上,結果應該被視爲未定義,你不能依賴它。
添加一些括號以獲得定義良好的結果並防止頭痛。

+0

我期望它在RDBMS之間有所不同,具體取決於實現方式,但不要求括號在相同的RDBMS中產生不同的結果。 – 2013-04-04 13:16:19

+1

@AnthonyGrist:爲什麼不呢?由於基本上沒有定義,其他因素(如加上括號)可以很好地改變結果。另請參閱我對您問題的最新評論。 – 2013-04-04 13:18:27

相關問題