PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Lewati array tag ke fungsi plpgsql dan gunakan dalam kondisi WHERE

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

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana date_trunc() Bekerja di PostgreSQL

  2. Postgresql menyortir data alfanumerik campuran

  3. Bagaimana cara mengubah kata sandi pengguna PostgreSQL?

  4. Membuat urutan PostgreSQL ke bidang (yang bukan ID catatan)

  5. Mengapa Postgres Mengizinkan Saya Memiliki Kolom tidak ada di Grup Oleh?