Удаление результата из полученного селекта в Postgresql
Есть таблица где есть поле типа character varying[]. В этом поле сохраняется номера телефонов в таком виде [+012345678901","+123456789012","2347587E+11"]. Как мне найти в этой таблице "неправильные" номера телефонов такого вида - 2347587E+11 и удалить? И чтоб после удаления в массиве было типа так:
- Массив до удаления [+012345678901","+123456789012","2347587E+11"]
- Массив после удаления [+012345678901","+123456789012"]
P.S. Использую postgresql
Ответы (1 шт):
Автор решения: Владимир Клыков
→ Ссылка
Один из вариантов, через вставку и разрешение конфликта:
insert into phones
with t as (select
ph.id,
unnest(ph.phones) as phone
FROM
phones ph )
select
id,
array_agg(phone) as phones
from
t
where phone like '%2%' // << место с фильтрацией "неверных" номеров
group by
id
on conflict(id) do update set phones = excluded.phones
Еще вариант через апдейт с условием:
update phones p set phones = t.phones from
(with t as (select
ph.id,
unnest(ph.phones) as phone
FROM
phones ph )
select
id,
array_agg(phone) as phones
from
t
where phone like '%2%' // << место с фильтрацией "неверных" номеров
group by
id
) as t(id,phones) where p.id = t.id
Еще вариант с подзапросом (без конструкции with, именно на него я вам намекал в комментариях):
update phones p set phones = t.phones from
(
select
id,
array_agg(phone) as phones
from
(select
ph.id,
unnest(ph.phones) as phone
FROM
public.phones ph
) as t(id, phone)
where phone like '%2%' // << место с фильтрацией "неверных" номеров
group by
id
) as t(id,phones) where p.id = t.id