проблема с для цикла по массиву внутри функции триггера - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь поставить триггер на столе. Эта таблица имеет столбец тела с типом текста. Текст в этом столбце может содержать упоминания @ {username}, и мне нужно извлечь их и записать в базу данных, а также уведомить мою заявку.

Приведенный ниже код работает, но я не думаю, что в идеале в блоке foreach я делаю дополнительный выбор, чтобы получить user_id, связанный с именем пользователя. Но проблема в том, что я не могу понять, как использовать json как массив. Я перепробовал много вещей, но я только что получил ошибку за ошибкой, и, откровенно говоря, у меня сейчас болит голова!

Мне также кажется странным, что мне нужно иметь массив usernames для того, чтобы извлечь имена пользователей, а затем поместить id, username, firebase_id в другой массив, но я не смог выбрать как результат parse_tokens, так и id, firebase_id из таблица пользователей в один массив.

Есть идеи? Любые другие предложения приветствуются. Спасибо

create or replace function notif() returns trigger as $$
  declare
    usernames text[];
    mentions json;
    mu text;
  begin
    select parse_tokens(new.body, '@') into usernames;
    select json_agg(tmp)
      from (
        select id, username, firebase_id
        into mentions
        from users
        where username=any(usernames)
      ) tmp;

    perform pg_notify('status', mentions::text);

    foreach mu in array usernames loop
      insert into mentions (status_id, from_user_id, to_user_id) values
        (new.id, new.user_id, (select id from users where username=mu));
    end loop;

    return new;
end; $$ language plpgsql;

1 Ответ

0 голосов
/ 25 мая 2019

хорошо, я решил проблему.Это именно то, что я хочу:

create type mention_info as (id integer, username varchar(64), firebase_id varchar(64));

create or replace function notif() returns trigger as $$
  declare
    mentions mention_info[];
    m mention_info;
  begin
    select array_agg(tmp) into mentions from 
      (select id, username, firebase_id from users
        where username=any(parse_tokens(new.body, '@'))) tmp;

    perform pg_notify('status', mentions::text);
    foreach m in array mentions loop
      insert into mentions
        (status_id, from_user_id, to_user_id) values (new.id, new.user_id, m.id);
    end loop;

    return new;
  end;
$$ language plpgsql;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...