删除 sql 中不区分大小写的重复项 (postgres)

Remove case insensitive duplicates in sql (postgres)

我有一个 postgresql 数据库,我正在尝试删除(或什至只是获取 ID)我 table 中较旧的重复项,但只有那些因为大小写灵敏度,例如 helLohello.

table 非常大,我的嵌套查询需要很长时间,我想知道是否有更好、更有效的方法来一次完成我的查询,而不是将其拆分为多个查询,因为有很多 id 有问题

SELECT * FROM some_table AS out
WHERE (SELECT count(*) FROM some_table AS in
    WHERE out.text != in.text 
    AND LOWER(in.text) = LOWER(out.text) 
    AND in.created_at > out.created_at) > 1

谢谢!

你能试试吗

SELECT LOWER(text), ROW_NUMBER() OVER( PARTITION by LOWER(text) ORDER by created_at ) as rn
FROM some_table 

然后您可以使用 rn 列作为过滤器

为了帮助这个查询,在 LOWER(text) 上创建一个 expression index。在索引中包含 created_at 以帮助进行日期比较。

CREATE INDEX text_lower ON some_table(LOWER(text), created_at);

不过,如果没有您的数据,很难对此进行测试。