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

SQL код:
CREATE TABLE docs (
   
id int PRIMARY KEY,
   
account bigint,
   
contact TEXT []
);
INSERT INTO docs VALUES(122, ARRAY ['Иван''Петр']);
INSERT INTO docs VALUES(222, ARRAY ['Иван']);
INSERT INTO docs VALUES(322, ARRAY['Иван''Виктор']);
INSERT INTO docs values(422, ARRAY['Иван''Роман''Сергей']); 


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

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

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

( Бойцовский клуб - во мне живут два человека, не удивляйтесь )
18.09.2022 10:32
vdm
 
У вас в предыдущем вопросе про план выполнения - запрос почти готовый (причин неиспользования индекса там не знаю).
На его основе:
SQL код:
WITH u (Contact) AS (
        
VALUES(ARRAY['Иван''Петр'])
    ),
    
u_docs AS (
        
SELECT 
            docs
.id AS "id",
            ARRAY(
SELECT UNNEST(docs.ContactEXCEPT SELECT UNNEST(u.Contact)) AS "Contact"
        
FROM Docsu
        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, время: 00:51.

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