5

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

SELECT 20.0/-2.0/5

SELECT 20/(-2.0)/5
4

1 回答 1

4

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

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

在 SQL Server 中,文档指定

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

所以这个计算符合规范:

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

现在添加减号

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

再次添加括号

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

所以不仅括号改变了顺序,减号也改变了。

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

于 2013-04-04T13:12:21.227 回答