sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man använder blandade int och numeriska argument i en Postgres 9.1+ funktion

De polymorfa typerna är strikta i detta ögonblick - i andra fall försöker PostgreSQL casta konstanter till den vanligaste typen, men detta steg saknas för polymorfa typer - så i det här fallet, när du har beskrivit problemet, måste du casta explicit eller bör inte använda polymorfa typer. Plan B är över funktionsöverbelastning .

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;

Då kommer din kod att fungera som förväntat:

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)



  1. MYSQL UNION DISTINKT

  2. SQL :ta bort sista kommatecken i strängen

  3. Ta bort join från två tabeller

  4. Vad betyder %Type i Oracle sql?