sql >> Databasteknik >  >> RDS >> PostgreSQL

Skicka array av taggar till en plpgsql-funktion och använd den i WHERE-tillstånd

Du återvänder faktiskt inte resultatet. Du skulle använda RETURN QUERY EXECUTE för det. Exempel:

Men du behöver inte dynamisk SQL här till att börja med ...

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;

Ring med faktisk array:

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

Eller ring med lista över objekt ("ordbok"):

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

Huvudpunkter

Inte säker på varför du har IF array_length(tags, 1) > 0 THEN , men kan förmodligen ersättas med IF tags IS NOT NULL THEN eller ingen IF överhuvudtaget och följ upp med IF NOT FOUND THEN . Mer:



  1. Entity Framework EF4.1 - lagrad procedur kunde inte hittas i behållaren

  2. hur infogar jag unicode-tecken i mysql med en insert-sats?

  3. Hur fixar jag, "PHP"-fabrikat, i Mac OS X (10.9.4)?

  4. Förklara Planera kostnadssmärta