Удаление результата из полученного селекта в Postgresql

Есть таблица где есть поле типа character varying[]. В этом поле сохраняется номера телефонов в таком виде [+012345678901","+123456789012","2347587E+11"]. Как мне найти в этой таблице "неправильные" номера телефонов такого вида - 2347587E+11 и удалить? И чтоб после удаления в массиве было типа так:

  1. Массив до удаления [+012345678901","+123456789012","2347587E+11"]
  2. Массив после удаления [+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
→ Ссылка