2

我有一个 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 不会返回任何行。

我不知道为什么。你有同样的问题吗?我怎样才能解决这个问题 ?

4

1 回答 1

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

根据文件

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

注意:

SELECT 1.33::numeric = 1.33::real;
 ?column? 
----------
 f
(1 row)
于 2011-08-17T16:02:50.487 回答