sql >> Database >  >> RDS >> PostgreSQL

Geef een reeks tags door aan een plpgsql-functie en gebruik deze in de WHERE-voorwaarde

Je komt niet echt terug het resultaat. U zou RETURN QUERY EXECUTE . gebruiken daarom. Voorbeeld:

Maar je hebt hier geen dynamische SQL nodig om te beginnen met ...

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;

Aanroepen met werkelijke array:

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

Of bel met lijst van items ("woordenboek"):

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

Belangrijkste punten

Ik weet niet zeker waarom je IF array_length(tags, 1) > 0 THEN . hebt , maar kan waarschijnlijk worden vervangen door IF tags IS NOT NULL THEN of geen IF helemaal niet en vervolg met IF NOT FOUND THEN . Meer:



  1. Waarschuwing:mysql_fetch_array() verwacht dat parameter 1 resource is, boolean gegeven in

  2. Dubbele rijen verwijderen uit oracle

  3. Numerieke functies in Oracle (volledige lijst)

  4. MySQL:selecteer 5 rijen voor en na een specifieke rij