postgresql 错误:函数round(双精度,整数)不存在

j9per5c4  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(4)|浏览(538)

我正在迁移一些查询,这些查询已经用MySQL数据库运行了很长时间,现在在Postgres中具有相同的结构。我被一个简单的round函数卡住了,它以下面的错误消息结束。
错误:函数round(双精度,整数)不存在
不起作用的部分选择:

round(floor(pools.available_capacity_in_kb/1024/1024/1024*100)/100,2) as free,

字符串
pools.available_capacity_in_kb在数据库中存储为BIGINT(Postgres 10.9)

t1qtbnec

t1qtbnec1#

我在地理坐标上也遇到了同样的问题。经度是开放街道Map数据的双精度,需要一个路由值。
我的解决方案运行良好:

select ROUND(CAST(longitude AS numeric),2) from my_points;

字符串

amrnrhlw

amrnrhlw2#

除了类型CAST语法,您还可以使用以下语法将一种类型的值转换为另一种(cast :: operator)

select ROUND(value::numeric, 2) from table_x;

字符串
请注意,带有强制转换运算符(::)的强制转换语法是PostgreSQL特定的,不符合SQL标准。

iyfjxgzm

iyfjxgzm3#

问题的核心在别的地方。PostgreSQL对整数和bigint数使用长除法(当除法的两个部分都是int,bigint值时)。所以pools.available_capacity_in_kb/1024/1024/1024*100)/100的结果是bigint。很可能这并不是你所期望的。

postgres=# \df round
                          List of functions
+------------+-------+------------------+---------------------+------+
|   Schema   | Name  | Result data type | Argument data types | Type |
+------------+-------+------------------+---------------------+------+
| pg_catalog | round | double precision | double precision    | func |
| pg_catalog | round | numeric          | numeric             | func |
| pg_catalog | round | numeric          | numeric, integer    | func |
+------------+-------+------------------+---------------------+------+
(3 rows)

字符串
bigint没有任何round函数(因为它没有任何意义)。请尝试使用浮点除法来修复它,例如

pools.available_capacity_in_kb/1024/1024/1024*100)/100.0


现在,结果将是numeric,并且函数round(numeric, int)存在--因此它应该可以工作。

nsc4cvqm

nsc4cvqm4#

也可以使用以下语法

select round((value::Decimal),2) from table_name;

字符串
请注意,带有强制转换运算符(::)的强制转换语法是PostgreSQL特定的,不符合SQL标准。

相关问题