sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL retourneert een functie met een aangepast gegevenstype

Dit zou gewoon moeten werken. De enum mag geen probleem zijn. Getest met Postgres 9.1 en 9.2

CREATE TYPE building_code AS ENUM ('IT','EMS','HSB','ENG');
CREATE TEMP TABLE venue (id int PRIMARY KEY, building_code building_code);
INSERT INTO venue VALUES (1, 'ENG');

CREATE OR REPLACE FUNCTION room_code(_id int) --!
  RETURNS building_code AS 
$func$
SELECT building_code FROM venue v WHERE v.id = $1 -- !
$func$ LANGUAGE SQL;

SELECT * FROM room_code(1);

Behalve ...

  • In versies vóór 9.2 u kunt alleen positionele (numerieke) parameters . gebruiken ($1 ) in SQL-functies (in tegenstelling tot plpgsql-functies).
    In 9.2+ de kolomnaam heeft voorrang, zodat de WHERE clausule van uw oorspronkelijke code zou altijd TRUE zijn en alle rijen zouden in aanmerking komen - behalve dat uw functie alleen de eerste retourneert, omdat deze geen SETOF building_code retourneert .
    Hernoem uw parameter of gebruik positionele parameter of, bij voorkeur, beide.
    Als u conflicterende parameternamen moet gebruiken, kunt u de voorkeur negeren door de functienaam te gebruiken om de parameter te kwalificeren. Vind ik leuk:

    ... WHERE v.id = room_code.id
    
  • Gebruik de typenaam niet als kolomnaam.

  • Gebruik geen niet-aangehaalde namen van hoofdletters en kleine letters, zoals roomCode , die naar kleine letters wordt gevouwen, tenzij u dubbel aanhaalt:"roomCode" .

->SQLfiddle met 3 varianten




  1. MySQL NIET IN-query

  2. Grondbeginselen van tabeluitdrukkingen, deel 8 – CTE's, overwegingen voor optimalisatie vervolg

  3. Groeperen in interval van 5 minuten binnen een tijdsbereik

  4. Waarom keert pg_restore met succes terug, maar herstelt mijn database niet echt?