Anda sebenarnya tidak kembali hasil. Anda akan menggunakan RETURN QUERY EXECUTE
untuk itu. Contoh:
Tetapi Anda tidak perlu SQL dinamis di sini untuk memulai dengan ...
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;
Panggil dengan array aktual:
SELECT * FROM get_items_by_tag(VARIADIC '{tag1,tag2}'::text[]);
Atau hubungi dengan daftar item ("kamus"):
SELECT * FROM get_items_by_tag('tag1', 'tag2');
Poin utama
-
Gunakan
RETURN QUERY
untuk benar-benar mengembalikan baris yang dihasilkan. -
Jangan gunakan SQL dinamis kecuali Anda membutuhkannya. (Tidak ada
EXECUTE
di sini.) -
Gunakan
ANY
konstruksi alih-alihIN
. Mengapa? -
Saya menyarankan
VARIADIC
fungsi untuk kenyamanan. Dengan cara ini Anda dapat melewatkan array atau daftar item yang Anda pilih. Lihat: -
Hindari pengidentifikasi huruf besar-kecil di Postgres jika memungkinkan.
Tidak yakin mengapa Anda memiliki IF array_length(tags, 1) > 0 THEN
, tapi mungkin bisa diganti dengan IF tags IS NOT NULL THEN
atau tidak ada IF
sama sekali dan tindak lanjuti dengan IF NOT FOUND THEN
. Selengkapnya: