Det här borde bara fungera. enum
borde inte vara ett problem. Testad med Postgres 9.1 och 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);
Utom ...
-
I versioner före 9.2 du kan bara använda positionella (numeriska) parametrar (
$1
) i SQL-funktioner (till skillnad från plpgsql-funktioner).
I 9.2+ kolumnnamnet skulle ha företräde, så attWHERE
satsen i din ursprungliga kod skulle alltid vara TRUE och alla rader skulle kvalificera - förutom att din funktion endast returnerar den första, eftersom den inte returnerar enSETOF building_code
.
Byt antingen namn på din parameter eller använd positionsparameter eller helst båda.
Om du måste använda motstridiga parameternamn kan du åsidosätta inställningen genom att använda funktionsnamnet för att kvalificera parametern. Gilla:... WHERE v.id = room_code.id
-
Du bör inte använda typnamnet som kolumnnamn.
- Du bör inte använda blandade skiftlägesnamn utan citationstecken som
roomCode
, som kommer att vikas till gemener, om du inte dubbelciterar:"roomCode"
.
->SQLfiddle med 3 varianter