Questo dovrebbe funzionare. Il enum
Non dovrebbe essere un problema. Testato con Postgres 9.1 e 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);
Tranne ...
-
Nelle versioni prima della 9.2 puoi utilizzare solo parametri posizionali (numerici) (
$1
) nelle funzioni SQL (a differenza delle funzioni plpgsql).
In 9.2+ il nome della colonna avrebbe la precedenza, in modo cheWHERE
la clausola del tuo codice originale sarebbe sempre TRUE e tutte le righe si qualificherebbero, tranne per il fatto che la tua funzione restituisce solo la prima, poiché non restituisce unSETOF building_code
.
Rinomina il parametro o utilizza il parametro posizionale o, preferibilmente, entrambi.
Se devi utilizzare nomi di parametri in conflitto, puoi ignorare la preferenza utilizzando il nome della funzione per qualificare il parametro. Come:... WHERE v.id = room_code.id
-
Non dovresti usare il nome del tipo come nome della colonna.
- Non dovresti usare nomi di casi misti senza virgolette come
roomCode
, che verrà piegato in minuscolo, a meno che tu non citi due volte:"roomCode"
.
->SQLfiddle con 3 varianti