PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So verwenden Sie gemischte int- und numerische Argumente in einer Postgres 9.1+-Funktion

Die polymorphen Typen sind in diesem Moment streng - in anderen Fällen versucht PostgreSQL, Konstanten in den gängigsten Typ umzuwandeln, aber dieser Schritt fehlt für polymorphe Typen - also müssen Sie in diesem Fall, wenn Sie das Problem beschrieben haben, explizit oder Sie umwandeln sollten keine polymorphen Typen verwenden. Plan B geht über die Funktionsüberlastung hinaus .

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;

Dann funktioniert Ihr Code wie erwartet:

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)