Как удалить массовые строки дублированных символов из строки в Postgres или SQLAlchemy? - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть таблица со столбцом с именем " ids ", тип String.Может кто-нибудь сказать мне, как удалить дублированные значения в каждой из строк?

Пример, таблица:

    --------------------------------------------------
    primary_key  |      ids
    --------------------------------------------------
        1        |  {23,40,23}
    --------------------------------------------------
        2        |  {78,40,13,78}
    --------------------------------------------------
        3        |  {20,13,20}
    --------------------------------------------------
        4        |  {7,2,7}
    --------------------------------------------------

, и я хочу обновить его в:

    --------------------------------------------------
    primary_key  |     ids
    --------------------------------------------------
        1        |  {23,40}
    --------------------------------------------------
        2        |  {78,40,13}
    --------------------------------------------------
        3        |  {20,13}
    --------------------------------------------------
        4        |  {7,2}
    --------------------------------------------------

В postgres я написал:

UPDATE table_name
SET ids = (SELECT DISTINCT UNNEST(
    (SELECT ids FROM table_name)::text[]))

В sqlalchemy я написал:

session.query(table_name.ids).\
    update({table_name.ids: func.unnest(table_name.ids,String).alias('data_view')},
           synchronize_session=False)

Ничто из этого не работает, поэтому, пожалуйста, помогите мне, спасибо заранее!

1 Ответ

0 голосов
/ 17 февраля 2019

Я думаю, вы могли бы улучшить дизайн, сохранив эти идентификаторы в другой таблице по одному идентификатору на строку с внешним ключом, ссылающимся на table_name.primary_key.

Также странное хранение данных Array в виде текстовых строк.

В любом случае, есть один способ сделать это: я завернул набор, возвращаемый UNNEST, внутренним подвыбором, чтобы иметь возможность применитьФункция aggregate_function необходима для повторного объединения строк.

UPDATE table_name 
SET ids = new_ids
FROM LATERAL (
    SELECT primary_key, array_agg(elem)::text AS new_ids
    FROM (SELECT DISTINCT primary_key, UNNEST(ids::text[]) as elem 
          FROM table_name ) t_inner  
          GROUP by primary_key )t_sub  
WHERE t_sub.primary_key = table_name.primary_key
...