我将尝试解释发生在我身上的事情,而不是粘贴我的每一段代码,因为它太多了。
如果我单独运行此查询,它会返回 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 风格编码,所以我有测试来证明正确的行为,我很高兴它会起作用
谢谢
最佳答案
你说 fqa[2]
是整数 5,d.distancia
是 float 值 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
调用可能是另一种选择,因为它们可以让您更好地控制 float 到整数的转换。
关于sql - 在 postgresql 上执行查询的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9221338/