PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Przekaż tablicę tagów do funkcji plpgsql i użyj jej w warunku WHERE

W rzeczywistości nie powracasz wynik. Użyjesz RETURN QUERY EXECUTE za to. Przykład:

Ale na początek nie potrzebujesz dynamicznego SQL-a...

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;

Zadzwoń z rzeczywistą tablicą:

SELECT * FROM get_items_by_tag(VARIADIC '{tag1,tag2}'::text[]);

Lub zadzwoń z listą pozycji ("słownik"):

SELECT * FROM get_items_by_tag('tag1', 'tag2');

Główne punkty

Nie wiem, dlaczego masz IF array_length(tags, 1) > 0 THEN , ale prawdopodobnie można je zastąpić tagami IF tags IS NOT NULL THEN lub nie IF w ogóle i kontynuuj z IF NOT FOUND THEN . Więcej:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak odjąć sekundy od daty i godziny postgres

  2. pg-promise:użyj wyniku jednego zapytania w następnym zapytaniu w ramach transakcji

  3. JavaScript (Postgres DB) - Jak używać przygotowanej instrukcji z tablicą jako parametrem w klauzuli WHERE IN ( )

  4. Postgres – Wiele sprzężeń powoduje, że moje zapytanie zwraca nieprawidłowe dane

  5. Jak korzystać z wielu operatorów LIKE i używać indeksu