爲什麼在SQL Server中以下兩個查詢的輸出是不同的,在Oracle中是一樣的?爲什麼SQL Server中的輸出與Oracle中的輸出不同?
SELECT 20.0/-2.0/5
SELECT 20/(-2.0)/5
爲什麼在SQL Server中以下兩個查詢的輸出是不同的,在Oracle中是一樣的?爲什麼SQL Server中的輸出與Oracle中的輸出不同?
SELECT 20.0/-2.0/5
SELECT 20/(-2.0)/5
我不同意你的聲明輸出應該是相同的。
如果你問我什麼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
這樣不僅括號變化訂單,但減號。
事實上,結果應該被視爲未定義,你不能依賴它。
添加一些括號以獲得定義良好的結果並防止頭痛。
我期望它在RDBMS之間有所不同,具體取決於實現方式,但不要求括號在相同的RDBMS中產生不同的結果。 – 2013-04-04 13:16:19
@AnthonyGrist:爲什麼不呢?由於基本上沒有定義,其他因素(如加上括號)可以很好地改變結果。另請參閱我對您問題的最新評論。 – 2013-04-04 13:18:27
什麼**是輸出,你期望什麼? – 2013-04-04 12:53:36
@marc_s我在SQL Server 2008中分別得到了'-50.000000000'和'-2.00000000',但是他們都希望它們只是'-50.000000000'。 – 2013-04-04 12:59:38
請注意,兩者都給-2在MySQL – 2013-04-04 13:02:59