web-dev-qa-db-ja.com

エラー:関数round(double precision、integer)は存在しません

私は移行の真っ最中です。現在、同じ構造を持つPostgresにあるMySQLデータベースで古くから実行されてきたいくつかのクエリがあります。次のエラーメッセージで終了する単純なラウンド関数でスタックしました。

エラー:関数round(double precision、integer)は存在しません

機能しない選択の一部:

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

pools.available_capacity_in_kbはデータベースにBIGINTとして保存されます(Postgres 10.9)

2
radek lopatecki

問題の核心はどこかにある。 PostgreSQLは整数とbigintの数値にlong除算を使用します(除算の両方の部分が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)が存在するため、機能するはずです。

1
Pavel Stehule