我有一个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不会返回任何行。
我无法弄清楚原因。你有同样的问题吗?我该如何解决这个问题?
答案 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
既不包含小数点也不包含小数点的数字常量 如果exponent的值适合,则最初假定exponent为integer类型 类型整数(32位);否则它被假定为bigint类型 它的值适合bigint类型(64位);否则它被认为是 键入数字。包含小数点和/或指数的常量 最初总是被假定为数字类型。
请注意:
SELECT 1.33::numeric = 1.33::real;
?column?
----------
f
(1 row)