2013-04-04 9 views
5

Dlaczego dane wyjściowe poniżej dwóch zapytań różnią się w SQL Server i takie same w Oracle?Dlaczego dane wyjściowe różnią się w SQL Server i takie same w Oracle?

SELECT 20.0/-2.0/5 

SELECT 20/(-2.0)/5 
+3

Co to jest ** wynik, a czego oczekujesz? –

+0

@ marc_s Otrzymuję odpowiednio '-50.000000000' i' -2.00000000' w SQL Server 2008, ale spodziewam się, że oba będą po prostu "-50.000000000". –

+0

Zauważ, że oba dają -2 w MySQL –

Odpowiedz

4

Nie zgadzam się ze stwierdzeniem, że dane wyjściowe powinny być takie same.
Jeśli spytasz mnie, co 20/-2/5 wiele wyników, odpowiem ci, że może wyjść -2 lub -50, zależy od szczegółów realizacji.

In Oracle, jedyne co wiesz to to, że operatory "*" i "/" są oceniane przed "+" i "-". Ale to wszystko. Nie znajduję żadnej dokumentacji na temat priorytetu, która daje operatorowi "*" i "/" między sobą.
Ponieważ dwie kwerendy dają -2, można założyć, że nawias został pominięty, a obliczenia wykonywane są od lewej do prawej.

In SQL Server, the docs specified that

Po dwóch operatorów w wyrażeniu mają tego samego operatora pierwszeństwo poziom, oni są oceniane od lewej do prawej na podstawie ich położenia w wyrażeniu .

Więc to obliczenie jest zgodne ze specyfikacją:

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

Teraz dodać znak minus

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

Dodaj nawias ponownie

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

Więc nie tylko zmianę nawias kolejność, ale znak minus.

W rzeczywistości wynik należy uznać za niezdefiniowany i nie można na nim polegać.
Dodaj trochę nawiasów, aby uzyskać dobrze zdefiniowany wynik i zapobiec bólowi głowy.

+0

Spodziewałbym się, że będzie różnił się między RDBMS w zależności od implementacji, ale nie w nawiasach, aby uzyskać inny wynik w tym samym RDBMS. –

+1

@AnthonyGrist: Dlaczego nie? Ponieważ jest to w zasadzie niezdefiniowane, inne czynniki - takie jak dodane nawiasy - mogą bardzo dobrze zmienić wynik. Zobacz także mój ostatni komentarz do Twojego pytania. –