PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come usare argomenti misti int e numerici in una funzione Postgres 9.1+

I tipi polimorfici sono severi in questo momento - in altri casi, PostgreSQL prova a eseguire il cast di costanti sul tipo più comune, ma questo passaggio manca per i tipi polimorfici - quindi in questo caso, quando hai descritto il problema, devi eseguire il cast in modo esplicito o non dovrebbe usare tipi polimorfici. Il piano B è terminato sovraccarico di funzioni .

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;

Quindi il tuo codice funzionerà come previsto:

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)