Essayez
SELECT round((1/3.)::numeric,4);
fonctionne avec n'importe quelle version de PostgreSQL.
Il y a un manque de surcharges dans certaines fonctions PostgreSQL, pourquoi (???):je pense "c'est un manque", et ci-dessous montre ma solution de contournement, mais voir cette discussion pour plus d'explications .
La surcharge comme stratégie de casting
Vous pouvez surcharger la fonction ARRONDI avec,
CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
SELECT ROUND($1::numeric,$2);
$$ language SQL IMMUTABLE;
Maintenant, votre instruction fonctionnera bien, essayez (après la création de la fonction)
SELECT round(1/3.,4); -- 0.3333 numeric
mais il renvoie un type NUMERIC... Pour préserver la première surcharge d'usage commun, nous pouvons renvoyer un flottant lorsqu'un paramètre de texte est proposé,
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;
Essayez
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 :Vous pouvez vérifier la surcharge par \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
Les fonctions pg_catalog sont celles par défaut, voir manual of build-in math fonctions .