postgresql不返回特定数字标准的值

时间:2011-08-17 15:42:59

标签: sql postgresql real-datatype

我有一个postgresql数据库,如下所示:

+---------------+---------------- ------+------------ ---+
|  id (bigint)  |  name (varying(255))  |  price (real)  |
+---------------+---------------- ------+------------ ---+
|       1       |          name 1       |        0.33    |
+---------------+---------------- ------+------------ ---+
|       1       |          name 2       |        1.33    |
+---------------+---------------- ------+------------ ---+
|       1       |          name 3       |        1       |
+---------------+---------------- ------+------------ ---+

然后我的查询结果:

SELECT * FROM my_table WHERE price = 1    -- OK (one row returned)
SELECT * FROM my_table WHERE price = 1.0  -- OK (one row returned)
SELECT * FROM my_table WHERE price = 1.33 -- FAIL (no row returned)
SELECT * FROM my_table WHERE price = 0.33 -- FAIL (no row returned)

当值无法转换为非浮动值时,postgresql不会返回任何行。

我无法弄清楚原因。你有同样的问题吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

我看到的一个解决方案是使用显式转换为real数据类型:

SELECT * FROM my_table WHERE price = 0.33::real;
 id |  name  | price 
----+--------+-------
  1 | name 1 |  0.33

SELECT * FROM my_table WHERE price = 1.33::real;
 id |  name  | price 
----+--------+-------
  1 | name 2 |  1.33

根据documentation

  

既不包含小数点也不包含小数点的数字常量   如果exponent的值适合,则最初假定exponent为integer类型   类型整数(32位);否则它被假定为bigint类型   它的值适合bigint类型(64位);否则它被认为是   键入数字。包含小数点和/或指数的常量   最初总是被假定为数字类型。

请注意:

SELECT 1.33::numeric = 1.33::real;
 ?column? 
----------
 f
(1 row)