Попробуйте также старый синтаксис приведения типов,
SELECT ROUND(AVG(some_column)::numeric,2)
FROM table;
работает с любой версией PostgreSQL.
Отсутствие перегрузок в некоторых функциях PostgreSQL, почему (???): Я думаю, что это недостаток (!), но @CraigRinger, @Catcall и команда PostgreSQL согласны с историческим обоснованием pg .
PS: еще один момент, связанный с округлением, - это точность, проверьте ответ @ IanKenney.
Перегрузка как стратегия приведения
Вы можете перегрузить функцию ROUND с помощью,
CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
SELECT ROUND($1::numeric,$2);
$$ language SQL IMMUTABLE;
Теперь ваша инструкция будет работать нормально, попробуйте (после создания функции)
SELECT round(1/3.,4); -- 0.3333 numeric
но он возвращает тип NUMERIC ... Чтобы сохранить первую перегрузку использования commom, мы можем вернуть тип FLOAT, когда предлагается параметр TEXT,
CREATE FUNCTION ROUND(float, text, int DEFAULT 0)
RETURNS FLOAT AS $$
SELECT CASE WHEN $2='dec'
THEN ROUND($1::numeric,$3)::float
-- ... WHEN $2='hex' THEN ... WHEN $2='bin' THEN... complete!
ELSE 'NaN'::float -- like an error message
END;
$$ language SQL IMMUTABLE;
Пытаться
SELECT round(1/3.,'dec',4); -- 0.3333 float!
SELECT round(2.8+1/3.,'dec',1); -- 3.1 float!
SELECT round(2.8+1/3.,'dec'::text); -- need to cast string? pg bug
PS: проверка \df round
после перегрузок покажет что-то вроде,
Schema | Name | Result data type | Argument data types
------------+-------+------------------+----------------------------
myschema | round | double precision | double precision, text, int
myschema | round | numeric | double precision, int
pg_catalog | round | double precision | double precision
pg_catalog | round | numeric | numeric
pg_catalog | round | numeric | numeric, int
Функции pg_catalog
являются функциями по умолчанию, см. руководство по встроенным математическим функциям < / а>.
person
Peter Krauss
schedule
05.01.2014
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
- person Vzzarr   schedule 21.04.2020