sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL - getallen met drijvende komma afronden

Probeer

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

werkt met elke versie van PostgreSQL.

Er is een gebrek aan overbelasting in sommige PostgreSQL-functies, waarom (???):ik denk dat "het een gebrek is", en laat hieronder mijn oplossing zien, maar zie deze discussie voor meer uitleg .

Overbelasting als castingstrategie

Je kunt overbelasten de RONDE functie met,

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

Nu zal je instructie goed werken, probeer het (na het maken van de functie)

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

maar het retourneert een type NUMERIC... Om de eerste commom-usage overload te behouden, kunnen we een float retourneren wanneer een tekstparameter wordt aangeboden,

 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;

Probeer

 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:U kunt de overbelasting controleren door \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                                              

De pg_catalog-functies zijn de standaardfuncties, zie handleiding van ingebouwde wiskunde functies .



  1. Kan ik een door een PDO voorbereide instructie gebruiken om een ​​identifier (een tabel- of veldnaam) of een syntaxissleutelwoord te binden?

  2. Sorteer bepaalde waarden naar boven

  3. Vreemde bestelfout (is het een fout?) bij het bestellen van twee kolommen met identieke waarden

  4. Trucs voor het uitvoeren van een string in een functie in Sql Server