postgres查询不匹配负双精度值

Posted

技术标签:

【中文标题】postgres查询不匹配负双精度值【英文标题】:postgres query not matching negative double precision values 【发布时间】:2016-11-03 10:44:04 【问题描述】:

我正在使用 psql (9.1.3)。我有一张桌子(比如说)A

A 有两列:

a_id : 整数

customer_pay : 双精度

我在表格中有这些值。

 a_id      | customer_pay |    

--------+--------------+

   1733684 |       -264.6 | 
   1723382 |      -314.84 |
   1728106 |        50.55 |
   1741636 |       -264.6 |  (4 rows)

但是当我这样做时

从 A 中选择 a_id,其中 customer_pay = -264.6;

什么都没有

我尝试了所有可能的精度变量,例如 -264.60、-264.00 等。 此查询适用于 +264.6。 如何选择负双精度类型的值。

谢谢你的帮助。

【问题讨论】:

我在 Oracle 中运行过这个,看起来不错。 我试着把 "",'',etc.Nothing for me in postgres. 如果您使用 WHERE ROUND(customer_pay) = -264 。有用吗? 没有。它没有。我试过。 BETWEEN 正在工作 如果“customer_pay”是某种货币,double 是错误的数据类型。请改用小数。 【参考方案1】:
select a_id
from a
where round(customer_pay::numeric, 2) = -264.6

From the manual:

使用数值的计算在可能的情况下会产生精确的结果,例如加法,减法,乘法。但是,与整数类型或下一节中描述的浮点类型相比,数值计算非常慢。

【讨论】:

【参考方案2】:

数据类型DOUBLE PRECISION 是一种近似的、不精确的数据类型。我看不出有什么理由,有人会使用它而不是确切的类型,例如 DECIMAL

对于近似数据类型,无论是什么语言,您都应该永远使用=。当比较一个不精确的数据值时,总是允许一些增量,例如where customer_pay between -264.6000001 and 264.5999999。仅此一项就可以解释为什么我从不使用它们;-)

【讨论】:

浮点数的优点是对它的操作更快。 @Clodoaldo Neto:是吗?在 PostgreSQL 中使用其中一个或另一个时,您甚至可以测量差异吗?如果有任何差异,应该可以忽略不计。 @Clodoaldo Neto:好的,但是在数据库中需要时间的是访问数据(读取索引和表、连接、过滤、排序、聚合)。列是十进制还是双精度数据类型的影响几乎为零,即查询需要 8 秒还是 8 秒加 3 纳秒无关紧要。

以上是关于postgres查询不匹配负双精度值的主要内容,如果未能解决你的问题,请参考以下文章

Postgres将所有数组值与和条件匹配到同一列

Postgres 在查询中使用函数

匹配h2 / postgres中的文字百分比?

迄今为止的 Postgres 双精度

从 Postgres 13 开始,哈希索引是不是最适合精确文本匹配查询?

postgres查询按AND部分匹配排序,然后OR匹配