16.09.2022 01:33
Использую СУБД Postgresql.
Есть таблица вида:

SQL код:
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['Иван', 'Роман', 'Сергей']); 


Есть массив строк контактов(например ['Иван', 'Петр']) и аккаунт, нужно из поля contact удалить
этих пользователей. Если после этого массив пустой, то нужно удалить запись целиком.
Например из набора:
SQL код:
1, 22, ARRAY ['Иван', 'Петр']
2, 22, ARRAY ['Иван', 'Петр']
3, 22, ARRAY['Иван', 'Виктор']
4, 22, ARRAY['Иван', 'Роман', 'Сергей'] 
После обновления таблица должна иметь вида:
SQL код:
3, 22, ARRAY['Виктор']
4, 22, ARRAY['Роман', 'Сергей'] 
Просьба помочь это сделать одним запросом
16.09.2022 07:52
polin11,

SQL код:
update docs set contacts = array_remove(contacts, 'Иван') 
16.09.2022 08:49
Цитата:
raidex update docs set contacts = array_remove(contacts, 'Иван')
Райдекс, ты что не видишь, тут написано "сделать одним запросом". А у тебя два запроса.

Думай прежде чем писать ответ :)

( Бойцовский клуб - во мне живут два человека, не удивляйтесь )
18.09.2022 10:32
У вас в предыдущем вопросе про план выполнения - запрос почти готовый (причин неиспользования индекса там не знаю).
На его основе:
SQL код:
WITH u (Contact) AS (
        VALUES(ARRAY['Иван', 'Петр'])
    ),
    u_docs AS (
        SELECT 
            docs.id AS "id",
            ARRAY(SELECT UNNEST(docs.Contact) EXCEPT SELECT UNNEST(u.Contact)) AS "Contact"
        FROM Docs, u
        WHERE Docs.Account = 22
          AND Docs.Contact && u.Contact
    ),
    del AS (
        DELETE
        FROM Docs
        USING u_docs
        WHERE Docs.id = u_docs.id
          AND u_docs."Contact" = '{}'
    )
        UPDATE Docs
        SET Contact = u_docs."Contact"
        FROM u_docs
        WHERE Docs.id = u_docs.id
          AND u_docs."Contact" <> '{}'
; 
Часовой пояс GMT +3, время: 12:01.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.