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
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
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.
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. –
@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. –
Co to jest ** wynik, a czego oczekujesz? –
@ marc_s Otrzymuję odpowiednio '-50.000000000' i' -2.00000000' w SQL Server 2008, ale spodziewam się, że oba będą po prostu "-50.000000000". –
Zauważ, że oba dają -2 w MySQL –