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

新手上路,请多包涵

我正在使用 MySQL 数据库迁移一些已经运行了很长时间的查询,这些数据库现在在 Postgres 中具有相同的结构。我被一个简单的圆形函数卡住了,它以以下错误消息结尾。

错误:函数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)

原文由 radek lopatecki 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

问题的核心在其他地方。 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)

—没有任何 round bigint (因为它没有任何意义)。请尝试使用浮点除法来修复它

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

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

原文由 Pavel Stehule 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

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

原文由 funnydman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进