PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment utiliser des arguments mixtes int et numériques dans une fonction Postgres 9.1+

Les types polymorphes sont stricts en ce moment - dans d'autres cas, PostgreSQL essaie de convertir les constantes en type le plus courant, mais cette étape est manquante pour les types polymorphes - donc dans ce cas, lorsque vous avez décrit le problème, vous devez convertir explicitement ou vous ne doit pas utiliser de types polymorphes. Le plan B est terminé la surcharge de fonctions .

CREATE OR REPLACE FUNCTION public.icase1(cond1 boolean,
                                         res1 integer, conddefault integer)
RETURNS integer AS $$
SELECT CASE WHEN $1 THEN $2 ELSE $3 END;
$$ LANGUAGE sql;

CREATE OR REPLACE FUNCTION public.icase1(cond1 boolean,
                                         res1 numeric, conddefault numeric)
RETURNS numeric AS $$
SELECT CASE WHEN $1 THEN $2 ELSE $3 END;
$$ LANGUAGE sql;

Ensuite, votre code fonctionnera comme prévu :

postgres=> select icase1(true, 1.0, 0);
 icase1 
--------
    1.0
(1 row)

postgres=> select icase1(true, 1.0, 1.0);
 icase1 
--------
    1.0
(1 row)

postgres=> select icase1(true, 1, 0);
 icase1 
--------
      1
(1 row)