Prova
SELECT round((1/3.)::numeric,4);
funziona con qualsiasi versione di PostgreSQL.
Ci sono una mancanza di sovraccarichi in alcune funzioni di PostgreSQL, perché (???):penso che "è una mancanza" e di seguito mostro la mia soluzione alternativa, ma vedi questa discussione per ulteriori spiegazioni .
Sovraccarico come strategia di casting
Puoi sovraccarico la funzione ROUND con,
CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
SELECT ROUND($1::numeric,$2);
$$ language SQL IMMUTABLE;
Ora le tue istruzioni funzioneranno bene, prova (dopo la creazione della funzione)
SELECT round(1/3.,4); -- 0.3333 numeric
ma restituisce un tipo NUMERIC... Per preservare il primo sovraccarico di uso comune, possiamo restituire un float quando viene offerto un parametro di testo,
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;
Prova
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:puoi controllare il sovraccarico con \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
Le funzioni pg_catalog sono quelle predefinite, vedere manual of build-in math funzioni .