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

标签 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 风格编码,所以我有测试来证明正确的行为,我很高兴它会起作用

谢谢

最佳答案

你说 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/

相关文章:

php - mysql不会返回正确的结果

postgresql - 无法删除 TypeORM 中的 OneToMany 记录

database - 需要用整型主键加入 double 外键

mysql - 如何显示多个表中包含特定值的行

mysql - mysql中如何比较固定int值与包含特殊字符和数字的列

mysql - 检查 MySQL 中的 JSON 值是否为空?

sql - 仅显示那些 SUM(price) 大于特定数字的行

database - INSERT 和多个 UPDATE 语句

sql - 如何在postgresql中检查日期

sql - PostgreSQL 整数数组值使用 desc 字符串连接到其他表中的整数