如何从Postgres或SQLAlchemy中的字符串中删除重复字符的大容量行?

时间:2019-02-17 16:49:20

标签: postgresql sqlalchemy duplicates sql-update

我有一个表,该表的列名为“ ids ”(字符串类型)。有人可以告诉我如何删除每一行中重复的值吗?

示例,表格为:

    --------------------------------------------------
    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 :(得分:1)

我认为您可以通过将这些id存储在另一个表中(每行一个id)并使用引用table_name.primary_key的外键来改进设计。

还将Array数据存储为文本字符串似乎很奇怪。

无论如何,这是一种实现方法:我用内部子选择包装了UNNEST返回的集合,以便能够应用再次连接字符串所需的gregation_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