为什么以下两个查询的输出在 SQL Server 中不同而在 Oracle 中相同?
SELECT 20.0/-2.0/5
SELECT 20/(-2.0)/5
为什么以下两个查询的输出在 SQL Server 中不同而在 Oracle 中相同?
SELECT 20.0/-2.0/5
SELECT 20/(-2.0)/5
我不同意您关于输出应该相同的说法。
如果你问我 20/-2/5 多少输出,我会回答你它可以输出 -2 或 -50,取决于实现细节。
在 Oracle中,您唯一知道的是运算符 '*' 和 '/' 在 '+' 和 '-' 之前计算。但仅此而已。我没有找到任何关于优先级给予操作员 '*' 和 '/' 的文档。
由于两个查询都给出-2,所以可以假设括号是剩下的,计算是从左到右进行的。
当表达式中的两个运算符具有相同的运算符优先级时,将根据它们在表达式中的位置从左到右计算它们。
所以这个计算符合规范:
20/2/5 = (20/2)/5 = 2
现在添加减号
20/-2/5 = 20/(-2/5) = -50
再次添加括号
20/(-2)/5 = (20/-2)/5 = -2
所以不仅括号改变了顺序,减号也改变了。
事实上,结果应该被认为是未定义的,你不能依赖它。
添加一些括号以获得明确的结果并防止头痛。