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

Sådan bruger du blandede int og numeriske argumenter i en Postgres 9.1+ funktion

De polymorfe typer er strenge i dette øjeblik - i andre tilfælde forsøger PostgreSQL at caste konstanter til den mest almindelige type, men dette trin mangler for polymorfe typer - så i dette tilfælde, når du har beskrevet problemet, skal du caste eksplicit eller du bør ikke bruge polymorfe typer. Plan B er overstået med funktionsoverbelastning .

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;

Så vil din kode fungere som forventet:

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. Sådan ændres datoformat i Oracle-database

  2. Tilføjelse til et databasefelt i stedet for at overskrive det (MySQL UPDATE-funktion)

  3. Psql liste over alle tabeller

  4. Rails konverterer ikke tidszone (PostgreSQL)