Coba juga sintaks lama untuk casting,
SELECT ROUND(AVG(some_column)::numeric,2)
FROM table;
berfungsi dengan semua versi PostgreSQL.
Ada kekurangan kelebihan dalam beberapa fungsi PostgreSQL, mengapa (???): Saya pikir "ini kekurangan" (!), Tetapi @CraigRinger, @Catcall dan tim PostgreSQL sepakat tentang "alasan historis pg".
PS: poin lain tentang pembulatan adalah keakuratan , periksa jawaban @ IanKenney .
Overloading sebagai strategi casting
Anda dapat membebani fungsi ROUND dengan,
CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
SELECT ROUND($1::numeric,$2);
$$ language SQL IMMUTABLE;
Sekarang instruksi Anda akan berfungsi dengan baik, coba (setelah pembuatan fungsi)
SELECT round(1/3.,4); -- 0.3333 numeric
tetapi mengembalikan tipe NUMERIC ... Untuk mempertahankan kelebihan penggunaan komom pertama, kita dapat mengembalikan tipe FLOAT ketika parameter TEXT ditawarkan,
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;
Mencoba
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: memeriksa \df round
setelah kelebihan beban, akan menunjukkan sesuatu seperti,
Skema | Nama | Jenis data hasil | Tipe data argumen
------------ + ------- + ------------------ + ---------- ------------------
myschema | bulat | presisi ganda | presisi ganda, teks, int
myschema | bulat | numerik | presisi ganda, int
pg_catalog | bulat | presisi ganda | presisi ganda
pg_catalog | bulat | numerik | numerik
pg_catalog | bulat | numerik | numerik, int
The pg_catalog
fungsi adalah orang-orang default, lihat manual build-in fungsi matematika .