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