【问题标题】:How to remove bulk rows of duplicated chars from string in Postgres or SQLAlchemy?如何从 Postgres 或 SQLAlchemy 中的字符串中删除大量重复字符行?
【发布时间】:2019-07-11 03:15:43
【问题描述】:

我有一个表,其中有一列名为 "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)

这些都不起作用,所以请帮助我,在此先感谢!

【问题讨论】:

    标签: postgresql sqlalchemy duplicates sql-update


    【解决方案1】:

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

    同时将数组数据存储为文本字符串似乎很奇怪。

    无论如何,这是一种方法:我用内部子选择包装了 UNNEST 返回的集合,以便能够应用再次连接字符串所需的聚合函数。

    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
    

    【讨论】:

    • 当有array_agg时,为什么要string_agg并手动形成一个数组字面量?
    • @Ilja Everilä 你是对的:array_agg() 并且转换为 varchar 也可以。我应该在答案中更改它吗? OP 没有显示表定义和列的确切类型。
    • @Clamp,非常感谢它成功了!我放了一个我的数据示例,所以我使用“主键”作为列名,所以它看起来像一个糟糕的设计,感谢您指出这一点! @Ilja Everilä 我认为 array_agg 和 string_agg 都适用于我的情况,但是由于我不需要对数据进行排序,所以 string_agg 应该没问题。
    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    相关资源
    最近更新 更多