Помогите пожалуйста написать функцию

Доброго времени суток. Прошу помощи в написании функции. Есть 2 таблицы:
tags:
id serial;
tag character varying;

groups:
id SERIAL;
title character varying;
tags character varying[]; -- Здесь храняться id из таблицы tags. Не знаю, имеет ли это значение, но для этого поля установлен индекс gin

Первоначально функция выглядела так:

CREATE OR REPLACE FUNCTION video_galery.groups_list(OUT o_id integer, OUT o_title character varying, OUT o_tags character varying[])
  RETURNS SETOF record AS
$BODY$
DECLARE
	r RECORD;
	sql CHARACTER VARYING;
BEGIN
	sql = '
		SELECT
			g.id,
			g.title,
			g.tags
		FROM
			video_galery.groups g
	';
	FOR r IN EXECUTE sql LOOP
		o_id = r.id;
		o_title = r.title;
		o_tags = r.tags;
		RETURN next;
	end loop;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION video_galery.groups_list()
  OWNER TO postgres;

Но её нужно переписать. Нужно чтобы в o_tags возвращались не id тегов, к которым относится данная запись, а сами теги.

Заранее спасибо за помощь.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Все намного проще:

Все намного проще:

CREATE OR REPLACE FUNCTION video_galery.groups_list(OUT o_id integer, OUT o_title character varying, OUT o_tags character varying[])
  RETURNS SETOF record AS
$BODY$
BEGIN
  RETURN QUERY
    SELECT id, title, 
           array(SELECT tag
                   FROM tags AS t
                  WHERE t.id = any(g.tags))
      FROM video_galery.groups g
END;
$BODY$ LANGUAGE plpgsql;

PS сделано допущение что в таблице groups поле tags имеет тип integer[], а не character varying[], ибо хранить массив id'шников в виде массива строк крайне не разумно.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023