Du vender faktisk ikke tilbage resultatet. Du ville bruge RETURN QUERY EXECUTE
for det. Eksempel:
Men du behøver ikke dynamisk SQL her til at begynde med ...
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;
Kald med faktisk array:
SELECT * FROM get_items_by_tag(VARIADIC '{tag1,tag2}'::text[]);
Eller ring med liste over emner ("ordbog"):
SELECT * FROM get_items_by_tag('tag1', 'tag2');
Vigtige punkter
-
Brug
RETURN QUERY
for faktisk at returnere resulterende rækker. -
Brug ikke dynamisk SQL, medmindre du har brug for det. (Ingen
EXECUTE
her.) -
Brug en
ANY
konstruktion i stedet forIN
. Hvorfor? -
Jeg foreslår en
VARIADIC
funktion for nemheds skyld. På denne måde kan du enten sende et array eller en liste over elementer efter eget valg. Se: -
Undgå identifikatorer med blandede sager i Postgres, hvis det er muligt.
Ikke sikker på, hvorfor du har IF array_length(tags, 1) > 0 THEN
, men kan sandsynligvis erstattes med IF tags IS NOT NULL THEN
eller ingen IF
overhovedet og følg op med IF NOT FOUND THEN
. Mere: