Versuchen Sie auch die alte Syntax für das Casting,
SELECT ROUND(AVG(some_column)::numeric,2)
FROM table;
funktioniert mit jeder Version von PostgreSQL.
Es gibt einen Mangel an Überladungen in einigen PostgreSQL-Funktionen, warum (???): Ich denke, "es ist ein Mangel" (!), Aber @CraigRinger, @Catcall und das PostgreSQL-Team sind sich über "pgs historische Begründung" einig.
PS: Ein weiterer Punkt beim Runden ist die Genauigkeit . Überprüfen Sie die Antwort von @ IanKenney .
Überladung als Casting-Strategie
Sie können die ROUND-Funktion mit überladen .
CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
SELECT ROUND($1::numeric,$2);
$$ language SQL IMMUTABLE;
Jetzt funktioniert Ihre Anweisung einwandfrei. Versuchen Sie es (nach der Funktionserstellung).
SELECT round(1/3.,4); -- 0.3333 numeric
Es wird jedoch ein NUMERIC-Typ zurückgegeben. Um die erste Überlastung bei der allgemeinen Nutzung zu erhalten, können wir einen FLOAT-Typ zurückgeben, wenn ein TEXT-Parameter angeboten wird.
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;
Versuchen
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: Überprüfung \df round
nach Überladungen, zeigt etwas wie,
Schema | Name | Ergebnisdatentyp | Argumentdatentypen
------------ + ------- + ------------------ + ---------- ------------------ ------------------.
Myschema | rund | doppelte Genauigkeit | doppelte Genauigkeit, Text, Int
Myschema | rund | numerisch | doppelte Präzision, int
pg_catalog | rund | doppelte Genauigkeit | Doppelte Genauigkeit
pg_catalog | rund | numerisch | numerisch
pg_catalog | rund | numerisch | numerisch, int
Die pg_catalog
Funktionen sind die Standardfunktionen, siehe Handbuch der eingebauten mathematischen Funktionen .