PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Предайте масив от тагове към plpgsql функция и я използвайте в условие WHERE

Вие всъщност не се връщате резултатът. Ще използвате RETURN QUERY EXECUTE за това. Пример:

Но тук нямате нужда от динамичен SQL, за да започнете с ...

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;

Извикване с действителен масив:

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

Или се обадете със списък с елементи ("речник"):

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

Основни точки

Не съм сигурен защо имате IF array_length(tags, 1) > 0 THEN , но вероятно може да се замени с IF tags IS NOT NULL THEN или без IF изобщо и последвайте с IF NOT FOUND THEN . Още:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Готови ли сме за Nordic PPGDay?

  2. JPA имена на таблици с главни букви

  3. невалидна последователност от байтове за кодиране на UTF8

  4. postgres функции и транзакции с BEGIN

  5. Как да генерирам uuid с PostgreSQL 8.4.4 на Ubuntu 10.04?