Спробуйте також старий синтаксис для кастингу,
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
але він повертає числовий тип ... Щоб зберегти перше перевантаження з використанням комутатора, ми можемо повернути тип 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
після перевантажень покаже щось на зразок,
Схема | Назва | Тип даних про результати | Типи даних аргументів
------------ + ------- + ------------------ + ---------- ------------------
мішема | круглі | подвійна точність | подвійна точність, текст, int
мішема | круглі | числовий | подвійна точність, int
pg_catalog | круглі | подвійна точність | подвійна точність
pg_catalog | круглі | числовий | числовий
pg_catalog | круглі | числовий | числовий, інт
Ці pg_catalog
функції є ті , за замовчуванням, см керівництво по збірці-математичних функцій .