Kevin Renskers
Kevin Renskers

Reputation: 5912

How to find duplicate case insensitive records in Postgresql?

I have a user table with the fields id and email (among others). The email address isn't case insensitive, a problem we want to fix, but we have some duplicate values in there (duplicate except the case, so currently we have [email protected] and [email protected] in there). I am now trying to get an overview of all the duplicate accounts, but this query is just taking forever, I had to cancel it after 5 minutes. The table has about 250.000 records.

select * from user u1
where (select count(*) from user u2
where LOWER(u1.email) = LOWER(u2.email)) > 1

I am finding plenty of examples to find literal duplicate records, but nothing for case-insensitive duplicates. Any ideas?

Upvotes: 1

Views: 619

Answers (1)

Jens
Jens

Reputation: 69440

You can use the having clause. Should be faster than the inner clause

select lower(email) 
from test 
group by lower(email) 
having count(*)>1

DEMO

Upvotes: 5

Related Questions