ОШИБКА: функция раунда (двойная точность, целое число) не существует - PullRequest
0 голосов
/ 06 ноября 2019

Я нахожусь в процессе миграции некоторых запросов, которые выполнялись целую вечность с базой данных MySQL, которая сейчас находится в Postgres, имеющей такую ​​же структуру. Я застрял с простой функцией округления, которая заканчивается следующим сообщением об ошибке.

ОШИБКА: функция округления (двойная точность, целое число) не существует

часть выборакоторый не работает:

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

pools.available_capacity_in_kb хранится в базе данных как BIGINT (Postgres 10.9)

1 Ответ

0 голосов
/ 06 ноября 2019

Суть проблемы в другом месте. PostgreSQL использует длинное деление для целых и больших чисел (когда в обеих частях деления используются значения типа 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) существует - поэтому она должна работать.

...