为什么SQL Server中的输出与Oracle中的输出不同?

Bri*_*rij 5 sql t-sql sql-server oracle plsql

为什么SQL Server中的以下两个查询的输出不同,Oracle中的输出相同?

SELECT 20.0/-2.0/5

SELECT 20/(-2.0)/5
Run Code Online (Sandbox Code Playgroud)

Cyr*_*don 4

我不同意你的说法,即输出应该是相同的。
如果你问我 20/-2/5 多少输出,我会回答你它可以输出 -2 或 -50,取决于实现细节。

在 Oracle 中,您唯一知道的是运算符“*”和“/”在“+”和“-”之前计算。但仅此而已。我没有找到任何关于运算符“*”和“/”之间的优先级的文档。
由于两个查询都给出-2,因此可以假设括号被剩下,并且从左到右进行计算。

在 SQL Server 中,文档指定

当表达式中的两个运算符具有相同的运算符优先级时,将根据它们在表达式中的位置从左到右计算它们。

所以这个计算符合规范:

20/2/5 = (20/2)/5 = 2
Run Code Online (Sandbox Code Playgroud)

现在添加减号

20/-2/5 = 20/(-2/5) = -50
Run Code Online (Sandbox Code Playgroud)

再次添加括号

20/(-2)/5 = (20/-2)/5 = -2
Run Code Online (Sandbox Code Playgroud)

因此,不仅括号改变了顺序,减号也改变了顺序。

事实上,结果应该被视为未定义,并且您不能依赖它。
添加一些括号以获得明确的结果并防止头痛。