sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL - avrundning av flyttal

Prova

SELECT round((1/3.)::numeric,4);

fungerar med alla versioner av PostgreSQL.

Det finns en brist på överbelastning i vissa PostgreSQL-funktioner, varför (???):Jag tror "det är en brist", och nedan visar min lösning, men se den här diskussionen för fler förklaringar .

Överbelastning som castingstrategi

Du kan överbelasta ROUND-funktionen med,

 CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
    SELECT ROUND($1::numeric,$2);
 $$ language SQL IMMUTABLE;

Nu kommer din instruktion att fungera bra, försök (efter att funktionen skapats)

 SELECT round(1/3.,4); -- 0.3333 numeric

men det returnerar en typ NUMERIC... För att bevara den första vanliga användningsöverbelastningen kan vi returnera en float när en textparameter erbjuds,

 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:Du kan kontrollera överbelastningen med \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                                              

Pg_catalog-funktionerna är standardfunktionerna, se manualen för inbyggd matematik funktioner .



  1. Postgresql-kolumnreferens-id är tvetydigt

  2. Hur man får värden för bindningsparametrar från Oracle JDBC PreparedStatement-objekt

  3. SQLite-gräns

  4. Hur lägger man till katalogplats till mysql varchar?