sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo usar argumentos numéricos e int mixtos en una función de Postgres 9.1+

Los tipos polimórficos son estrictos en este momento; en otros casos, PostgreSQL intenta convertir las constantes en el tipo más común, pero este paso falta para los tipos polimórficos; por lo tanto, en este caso, cuando haya descrito el problema, debe realizar la conversión explícitamente o no debe utilizar tipos polimórficos. El plan B ha terminado con la sobrecarga de funciones .

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;

Entonces su código funcionará como se esperaba:

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)