在postgresql上执行查询的奇怪行为

时间:2012-02-10 01:01:06

标签: sql postgresql postgresql-9.1

我会尝试解释发生在我身上的事情而不会粘贴我的每一段代码,因为它很多。

如果我单独运行此查询,则返回6.0(预期行为)

select distancia_euclediana_para_imagenes(vector_cuadrante1,
                       vector_cuadrante2,
                       vector_cuadrante3,
                       vector_cuadrante4,
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)])
from imagen,pivotes 
where id=id_imagen and indice_pivote=2

如果我运行这个其他查询,它返回2(再次是预期的行为)

with distancia_a_pivote(distancia) as
(select distancia_euclediana_para_imagenes(vector_cuadrante1,
                       vector_cuadrante2,
                       vector_cuadrante3,
                       vector_cuadrante4,
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)])
from imagen,pivotes 
where id=id_imagen and indice_pivote=2)
select id from imagen, indice, distancia_a_pivote d
where id=id_imagen  and
fqa[2]>= 6-1 and
fqa[2]<= d.distancia+1;

然而,通过这个小小的改变它停止工作并且什么都不返回

with distancia_a_pivote(distancia) as
(select distancia_euclediana_para_imagenes(vector_cuadrante1,
                       vector_cuadrante2,
                       vector_cuadrante3,
                       vector_cuadrante4,
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)])
from imagen,pivotes 
where id=id_imagen and indice_pivote=2)
select id from imagen, indice, distancia_a_pivote d
where id=id_imagen  and
fqa[2]>= d.distancia-1 and
fqa[2]<= d.distancia+1;

如果你能帮助我,我将不胜感激,因为我不知道是什么原因引起了这个问题。除了我一直在TDD风格的编码,所以我有测试来证明正确的行为,我很漂亮它会起作用

由于

1 个答案:

答案 0 :(得分:1)

您说fqa[2]是整数5而d.distancia浮点值6.0。这意味着你最终会看到这个:

5 >= 6.0 - 1

那个6.0可能不准确,所以6.0 - 1可能会出现小于5.0的阴影,你的比较会失败。一种解决方案是添加一点摆动空间来解决通常的浮点问题:

fqa[2] >= d.distancia - 1.00001 and
fqa[2] <= d.distancia + 1.00001

0.00001只是一个例子,您需要查看您的情况,看看您应该允许多少额外费用。添加ceil and floor调用可能是另一种选择,因为它们可以让您更好地控制浮点到整数转换。