Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PostgreSQL > Удалить из массива элементы


Автор: polin11 16.9.2022, 01:37
Использую СУБД Postgresql.
Есть таблица вида:

Код

CREATE TABLE docs (
   id int PRIMARY KEY,
   account bigint,
   contact TEXT []
);
INSERT INTO docs VALUES(1, 22, ARRAY ['Иван', 'Петр']);
INSERT INTO docs VALUES(2, 22, ARRAY ['Иван']);
INSERT INTO docs VALUES(3, 22, ARRAY['Иван', 'Виктор']);
INSERT INTO docs values(4, 22, ARRAY['Иван', 'Роман', 'Сергей']);


https://www.db-fiddle.com/f/p4... ck3ws8tJ/0

Есть массив строк контактов(например ['Иван','Петр']) и аккаунт, нужно из поля contact удалить
этих пользователей. Если после этого массив пустой, то нужно удалить запись целиком.
Например из набора:
Код

1, 22, ARRAY ['Иван','Петр']
2, 22, ARRAY ['Иван']
3, 22, ARRAY['Иван', 'Виктор']
4, 22, ARRAY['Иван', 'Роман', 'Сергей']


После обновления таблица должна иметь вида:
Код

3, 22, ARRAY['Виктор']
4, 22, ARRAY['Роман', 'Сергей']

Просьба помочь это сделать одним запросом

Автор: Akina 16.9.2022, 12:39
Удаление и обновление одним запросом? что-то сомнительно...

Автор: polin11 16.9.2022, 14:21
Почему не одним запросом, например update или delete обернуть в cte?

Автор: Akina 17.9.2022, 09:49
Цитата(polin11 @  16.9.2022,  15:21 Найти цитируемый пост)
Почему не одним запросом, например update или delete обернуть в cte?

Потому что обернув действие в CTE, ты "разведёшь" и фактически материализуешь исходное и промежуточное состояния. И какое из них будет редактироваться дальше? Исходное? тогда первое изменение потеряется... промежуточное? но к нему не получится обратиться, оно не существует физически.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)