询问
SELECT COUNT(*),name,number FROM tbl GROUP BY name,number HAVING COUNT(*) > 1
它有时无法在小写和大写之间找到重复.
例如:晴天和阳光不会显示为重复.
那么如何在Postgresql中为两列找到所有可能的重复项.
解决方法
lower()
/
upper()
使用其中一个将字符折叠为大写或小写.特殊字符不受影响:
SELECT count(*),lower(name),number FROM tbl GROUP BY lower(name),number HAVING count(*) > 1;
如果你真的想忽略变音符号,就像你的评论所暗示的那样,安装附加模块unaccent
,它提供了一个删除重音的文本搜索字典以及通用功能unaccent():
CREATE EXTENSION unaccent;
使它非常简单:
SELECT lower(unaccent('Büßercafé')) AS norm
结果:
busercafe
这不会剥离非字母.添加像@Craig那样的regexp_replace():
SELECT lower(unaccent(regexp_replace('$s^o&f!t Büßercafé','\W','','g') )) AS norm
结果:
softbusercafe
您甚至可以在其上构建功能索引: