【问题标题】:Why is the output different in SQL Server and same in Oracle?为什么 SQL Server 中的输出不同而 Oracle 中的输出相同?
【发布时间】:2013-03-26 13:23:00
【问题描述】:

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

SELECT 20.0/-2.0/5

SELECT 20/(-2.0)/5

【问题讨论】:

  • 输出是什么,你期待什么??
  • @marc_s 我在 SQL Server 2008 中分别得到 -50.000000000-2.00000000,但希望它们都只是 -50.000000000
  • 请注意,在 MySQL 中两者都给出 -2
  • 这表明了一件重要的事情:这个问题纯粹是学术性的。我会认为实际程序中的这段代码是一个错误,因为它的含义非常不清楚,因为(20/-2.0)/5 不是20/(-2.0/5)。使用括号。
  • @praveen:这取决于表达式是从左到右还是从右到左执行。 MySql 似乎从左到右执行,Oracle 从右到左执行。而在 SQL-Server 中,2.0 周围的括号似乎通过增加第一个除法的优先级来改变方向。

标签: sql sql-server oracle tsql plsql


【解决方案1】:

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

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

In SQL Server, the docs specified that

当一个表达式中的两个运算符具有相同的运算符优先级时 级别,根据他们在 表达。

所以这个计算符合规范:

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

现在添加减号

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

再次添加括号

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

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

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

【讨论】:

  • 我希望它在 RDBMS 之间会有所不同,具体取决于实现,但括号不会在同一个 RDBMS 中导致不同的结果。
  • @AnthonyGrist:为什么不呢?由于它基本上是未定义的,因此其他因素(例如添加的括号)可以很好地改变结果。另请参阅我对您的问题的最新评论。
猜你喜欢
  • 2020-06-12
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
相关资源
最近更新 更多