Wypróbuj
SELECT round((1/3.)::numeric,4);
działa z każdą wersją PostgreSQL.
W niektórych funkcjach PostgreSQL brakuje przeciążeń, dlaczego (???):Myślę, że "to jest brak", a poniżej pokazuje moje obejście, ale zobacz ta dyskusja zawiera więcej wyjaśnień .
Przeciążanie jako strategia przesyłania
Możesz przeciążać funkcja ZAOKR z,
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 NUMERIC... Aby zachować pierwsze przeciążenie użycia przecinka, możemy zwrócić liczbę zmiennoprzecinkową, gdy oferowany jest parametr tekstowy,
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...
ELSE 'NaN'::float -- is like a error message
END;
$$ language SQL IMMUTABLE;
Wypróbuj
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:Przeciążenie można sprawdzić za pomocą \df,
\df round
Schema | Name | Datatype of result | Datatype of parameters
-----------+-------+---------------------------+--------------------------------
myschema | round | numeric | double precision, integer
myschema | round | double precision | double precision, text, integer
pg_catalog | round | double precision | double precision
pg_catalog | round | numeric | numeric
pg_catalog | round | numeric | numeric, integer
Funkcje pg_catalog są domyślnymi, zobacz instrukcję wbudowanej matematyki funkcje .