Условно сделать INSERT на основе результата SELECT в функции postgres sql - PullRequest
0 голосов
/ 21 апреля 2020

Как я могу сделать INSERT для таблицы, основываясь на том, есть ли значения в другой таблице? Вот пример

create table mygroup (
  group_id integer primary key,
  other_id integer not null references othertable(other_id)
);

create table myitem (
  group_id integer not null references mygroup(group_id),
  item_id integer not null
);

create function add_to_group (group_arg integer, item_arg integer, other_arg integer) language sql as $$
  select * from mygroup where group_id = group_arg and other_id = other_arg;
  -- Do the next statement only if the previous one had a result
  insert into myitem (group_id, item_id) values (group_arg, item_arg);
$$;

Если бы я использовал функцию plpg sql, можно было бы сделать это с if (found). Но как я могу сделать это с помощью простой функции sql? Есть ли способ объединить оба оператора в один, например, сделать INSERT с JOIN?

1 Ответ

0 голосов
/ 21 апреля 2020

Я думаю, вы просто хотите exists:

insert into myitem (group_id, item_id) 
    select v.group_id, v.item_id
    from (values (group_arg, item_arg)) v(group_id, item_id)
    where exists (select 1
                  from mygroup g
                  where g.group_id = v.group_id and v.other_id = other_arg
                 );

Или вы можете использовать select, если только одна строка в таблице mygroup должна соответствовать:

insert into myitem (group_id, item_id) 
    select group_arg, item_arg
    from mygroup g
    where g.group_id = group_arg and v.other_id = other_arg;

Если возможны дубликаты, вы можете настроить это так:

insert into myitem (group_id, item_id) 
    select distinct group_arg, item_arg
    from mygroup g
    where g.group_id = group_arg and g.other_id = other_arg;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...