Sie kehren nicht wirklich zurück das Ergebnis. Sie würden RETURN QUERY EXECUTE
verwenden dafür. Beispiel:
Aber Sie brauchen hier zunächst kein dynamisches SQL ...
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;
Aufruf mit aktuellem Array:
SELECT * FROM get_items_by_tag(VARIADIC '{tag1,tag2}'::text[]);
Oder Aufruf mit Artikelliste ("Wörterbuch"):
SELECT * FROM get_items_by_tag('tag1', 'tag2');
Wichtige Punkte
-
Verwenden Sie
RETURN QUERY
um die resultierenden Zeilen tatsächlich zurückzugeben. -
Verwenden Sie kein dynamisches SQL, es sei denn, Sie benötigen es. (Kein
EXECUTE
hier.) -
Verwenden Sie einen
ANY
stattIN
konstruieren . Warum? -
Ich schlage ein
VARIADIC
vor Funktion für Komfort. Auf diese Weise können Sie entweder ein Array oder eine Liste von Elementen Ihrer Wahl übergeben. Siehe: -
Vermeiden Sie nach Möglichkeit gemischte Groß- und Kleinschreibung in Postgres.
Nicht sicher, warum Sie IF array_length(tags, 1) > 0 THEN
haben , kann aber wahrscheinlich durch IF tags IS NOT NULL THEN
ersetzt werden oder kein IF
überhaupt und folgen Sie mit IF NOT FOUND THEN
. Mehr: