あなたは実際には戻ってきたではありません 結果。 RETURN QUERY EXECUTE
を使用します そのために。例:
ただし、最初に動的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;
実際の配列で呼び出す:
SELECT * FROM get_items_by_tag(VARIADIC '{tag1,tag2}'::text[]);
または、アイテムのリスト(「辞書」)を使用して呼び出します:
SELECT * FROM get_items_by_tag('tag1', 'tag2');
主なポイント
-
RETURN QUERY
を使用します 結果の行を実際に返します。 -
必要な場合を除いて、動的SQLを使用しないでください。 (
EXECUTE
はありません ここに。) -
ANY
を使用するIN
の代わりに構築する 。なぜですか? -
VARIADIC
をお勧めします 便利な機能。このようにして、選択した項目の配列またはリストを渡すことができます。参照: -
可能であれば、Postgresで大文字と小文字が混在する識別子は避けてください。
IF array_length(tags, 1) > 0 THEN
がある理由がわかりません 、ただし、おそらくIF tags IS NOT NULL THEN
に置き換えることができます。 またはIF
なし まったく、IF NOT FOUND THEN
でフォローアップします 。詳細: