我有一个WITH AS查询,我希望您能理解它的简洁性,我已经将它归结为问题所在:

WITH XX AS (
   SELECT ....,
   floor(GREATEST(value*-1, value2) * (value4*value5/value) * -1 * 100)/100 as x,
   ....
)

然后我在后面的查询中使用这个
SELECT 1/x as "ratio" from XX

这是一堆排消失的地方,
如果我这样做了:
SELECT 2/1*x "ratio" from XX

同样奇怪的是,这会返回相同的结果:
SELECT 2*1*x "ratio" from XX

行返回,但ratio的值不正确。我也尝试过使用CAST,但它仍然会返回不正确的结果。奇怪的是,结果实际上是2*x而不是2/x的结果
为什么结果不正确,为什么行消失?

最佳答案

SELECT 2/1*x "ratio" from XX

相当于
SELECT 2*1*x "ratio" from XX

因为乘法和除法是从左到右计算的。因此,第一个表达式的计算结果是(2 / 1) * x,而不是2 / (1 * x)
顺便说一句:你的算法有点像整数算法,应该用浮点算法来实现,比如你最好把表达式写成2.0 / x

关于postgresql - Postgres除法不正确,行在WITH查询中消失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41255662/

10-12 21:48