我正在迁移一些查询,这些查询已经用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)
4条答案
按热度按时间t1qtbnec1#
我在地理坐标上也遇到了同样的问题。经度是开放街道Map数据的双精度,需要一个路由值。
我的解决方案运行良好:
字符串
amrnrhlw2#
除了类型CAST语法,您还可以使用以下语法将一种类型的值转换为另一种
(cast :: operator)
:字符串
请注意,带有强制转换运算符(::)的强制转换语法是PostgreSQL特定的,不符合SQL标准。
iyfjxgzm3#
问题的核心在别的地方。PostgreSQL对整数和bigint数使用长除法(当除法的两个部分都是int,bigint值时)。所以
pools.available_capacity_in_kb/1024/1024/1024*100)/100
的结果是bigint。很可能这并不是你所期望的。字符串
bigint
没有任何round
函数(因为它没有任何意义)。请尝试使用浮点除法来修复它,例如型
现在,结果将是
numeric
,并且函数round(numeric, int)
存在--因此它应该可以工作。nsc4cvqm4#
也可以使用以下语法
字符串
请注意,带有强制转换运算符(::)的强制转换语法是PostgreSQL特定的,不符合SQL标准。