PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como usar argumentos int e numéricos mistos em uma função Postgres 9.1+


Os tipos polimórficos são restritos neste momento - em outros casos, o PostgreSQL tenta converter constantes para o tipo mais comum, mas esta etapa está faltando para tipos polimórficos - então, neste caso, quando você descreveu o problema, você deve converter explicitamente ou não deve usar tipos polimórficos. O plano B acabou sobrecarga de funções .
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;

Então seu código funcionará como esperado:
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)