Spróbuj także starej składni przesyłania,
SELECT ROUND(AVG(some_column)::numeric,2)
FROM table;
współpracuje z dowolną wersją PostgreSQL.
W niektórych funkcjach PostgreSQL brakuje przeciążeń , dlaczego (???): Myślę, że „to brak” (!), Ale @CraigRinger, @Catcall i zespół PostgreSQL zgadzają się co do „historycznego uzasadnienia pg”.
PS: innym punktem zaokrąglania jest dokładność , sprawdź odpowiedź @ IanKenney .
Przeciążenie jako strategia rzutowania
Możesz przeładować funkcję ROUND za pomocą,
CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
SELECT ROUND($1::numeric,$2);
$$ language SQL IMMUTABLE;
Teraz twoja instrukcja będzie działać poprawnie, spróbuj (po utworzeniu funkcji)
SELECT round(1/3.,4); -- 0.3333 numeric
ale zwraca typ NUMERYCZNY ... Aby zachować pierwsze przeciążenie komom, możemy zwrócić typ FLOAT, gdy oferowany jest parametr 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;
Próbować
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: sprawdzanie \df round
po przeciążeniu pokaże coś takiego,
Schemat | Imię | Wynikowy typ danych | Typy danych argumentów
------------ + ------- + ------------------ + ---------- ------------------
myschema | okrągły | podwójna precyzja | podwójna precyzja, tekst, int
myschema | okrągły | numeryczny | podwójna precyzja, int
pg_catalog | okrągły | podwójna precyzja | podwójna precyzja
pg_catalog | okrągły | numeryczny | numeryczny
pg_catalog | okrągły | numeryczny | numeryczny, int
Te pg_catalog
funkcje są te domyślne, patrz instrukcja z wbudowanym funkcji matematycznych .