还尝试使用旧的强制转换语法,
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使用超载,我们可以在提供TEXT参数时返回FLOAT类型,
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
超载后检查,会显示类似的内容,
架构| 姓名| 结果数据类型| 参数数据类型
------------ + ------- + ------------------ + ---------- ------------------
myschema | 圆形 双精度| 双精度,文本,整数
myschema | 圆形 数字| 双精度,整数
pg_catalog | 圆形 双精度| 双精度
pg_catalog | 圆形 数字| 数字
pg_catalog | 圆形 数字| 数字,整数
这些pg_catalog
函数是默认函数,请参见内置数学函数手册。