Hãy thử cú pháp cũ để truyền,
SELECT ROUND(AVG(some_column)::numeric,2)
FROM table;
hoạt động với bất kỳ phiên bản nào của PostgreSQL.
Thiếu một số chức năng quá tải trong một số chức năng của PostgreSQL, tại sao (???): Tôi nghĩ rằng "đó là thiếu" (!), Nhưng @CraigRinger, @Catcall và nhóm PostgreQuery đồng ý về "lý do lịch sử của pg".
PS: một điểm khác về làm tròn là độ chính xác , hãy kiểm tra câu trả lời của @ IanKenney .
Quá tải như chiến lược đúc
Bạn có thể quá tải hàm ROUND với,
CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
SELECT ROUND($1::numeric,$2);
$$ language SQL IMMUTABLE;
Bây giờ hướng dẫn của bạn sẽ hoạt động tốt, hãy thử (sau khi tạo chức năng)
SELECT round(1/3.,4); -- 0.3333 numeric
nhưng nó trả về một kiểu SỐ ... Để duy trì tình trạng quá tải sử dụng dấu phẩy đầu tiên, chúng ta có thể trả về loại FLOAT khi tham số TEXT được cung cấp,
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;
Thử
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: kiểm tra \df round
sau khi quá tải, sẽ hiển thị một cái gì đó như,
Lược đồ | Tên | Kiểu dữ liệu kết quả | Các kiểu dữ liệu đối số
------------ + ------- + ------------------ + ---------- ------------------
myschema | vòng | độ chính xác kép | độ chính xác kép, văn bản, int
myschema | vòng | số | độ chính xác kép, int
pg_catalog | vòng | độ chính xác kép | độ chính xác kép
pg_catalog | vòng | số | số
pg_catalog | vòng | số | số, int
Các pg_catalog
hàm là mặc định, xem hướng dẫn sử dụng các hàm toán học tích hợp .