ERROR: function round(double precision, integer) does not exist
ERROR: function round(double precision, integer) does not exist
我正在迁移一些查询,这些查询已经 运行 多年了,MySQL 数据库现在在具有相同结构的 Postgres 中。我被简单的圆形函数卡住了,该函数以以下错误消息结尾。
ERROR: function round(double precision, integer) does not exist
部分 select 不起作用:
round(floor(pools.available_capacity_in_kb/1024/1024/1024*100)/100,2) as free,
pools.available_capacity_in_kb
在数据库中存储为 BIGINT (Postgres 10.9)
问题的核心在别的地方。 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)
存在 - 所以它应该可以工作。
我在地理坐标方面遇到了同样的问题。经度是来自开放街道地图数据的双精度,需要一个四舍五入的值。
我的解决方案工作正常:
select ROUND(CAST(longitude AS numeric),2) from my_points;
除了类型 CAST 语法之外,您还可以使用以下语法将一种类型的值转换为另一种类型(cast :: 运算符):
select ROUND(value::numeric, 2) from table_x;
请注意,带有转换运算符 (::) 的转换语法是 PostgreSQL 特定的,不符合 SQL 标准。
我正在迁移一些查询,这些查询已经 运行 多年了,MySQL 数据库现在在具有相同结构的 Postgres 中。我被简单的圆形函数卡住了,该函数以以下错误消息结尾。
ERROR: function round(double precision, integer) does not exist
部分 select 不起作用:
round(floor(pools.available_capacity_in_kb/1024/1024/1024*100)/100,2) as free,
pools.available_capacity_in_kb
在数据库中存储为 BIGINT (Postgres 10.9)
问题的核心在别的地方。 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)
存在 - 所以它应该可以工作。
我在地理坐标方面遇到了同样的问题。经度是来自开放街道地图数据的双精度,需要一个四舍五入的值。
我的解决方案工作正常:
select ROUND(CAST(longitude AS numeric),2) from my_points;
除了类型 CAST 语法之外,您还可以使用以下语法将一种类型的值转换为另一种类型(cast :: 运算符):
select ROUND(value::numeric, 2) from table_x;
请注意,带有转换运算符 (::) 的转换语法是 PostgreSQL 特定的,不符合 SQL 标准。