私は移行の真っ最中です。現在、同じ構造を持つ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)
問題の核心はどこかにある。 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)
が存在するため、機能するはずです。