Je komt niet echt terug het resultaat. U zou RETURN QUERY EXECUTE
. gebruiken daarom. Voorbeeld:
Maar je hebt hier geen dynamische SQL nodig om te beginnen met ...
CREATE OR REPLACE FUNCTION get_items_by_tag(VARIADIC tags text[])
RETURNS TABLE (id int, title text, tag text[]) AS
$func$
BEGIN
IF array_length(tags, 1) > 0 THEN
-- NO need for EXECUTE
RETURN QUERY
SELECT d.id, d.title, array_agg(t.title)
FROM items d
JOIN item_tags dt ON dt.item_id = d.id
JOIN tags t ON t.id = dt.tag_id
AND t.title = ANY ($1) -- use ANY construct
GROUP BY d.id; -- PK covers whole table
-- array_to_string(tags, ',') -- no need to convert array with ANY
-- ELSE ...
END IF;
END
$func$ LANGUAGE plpgsql;
Aanroepen met werkelijke array:
SELECT * FROM get_items_by_tag(VARIADIC '{tag1,tag2}'::text[]);
Of bel met lijst van items ("woordenboek"):
SELECT * FROM get_items_by_tag('tag1', 'tag2');
Belangrijkste punten
-
Gebruik
RETURN QUERY
om de resulterende rijen daadwerkelijk te retourneren. -
Gebruik geen dynamische SQL tenzij je het nodig hebt. (Geen
EXECUTE
hier.) -
Gebruik een
ANY
constructie in plaats vanIN
. Waarom? -
Ik stel voor een
VARIADIC
functie voor het gemak. Op deze manier kunt u naar keuze een array of een lijst met items doorgeven. Zie: -
Vermijd indien mogelijk identifiers met hoofdletters in Postgres.
Ik weet niet zeker waarom je IF array_length(tags, 1) > 0 THEN
. hebt , maar kan waarschijnlijk worden vervangen door IF tags IS NOT NULL THEN
of geen IF
helemaal niet en vervolg met IF NOT FOUND THEN
. Meer: