sql - 在忽略大小写和特殊字符的两列中查找可能的重复项

标签 sql postgresql duplicates pattern-matching case-insensitive

查询

SELECT COUNT(*), name, number
FROM   tbl
GROUP  BY name, number
HAVING COUNT(*) > 1

有时无法找到小写和大写之间的重复项。
例如:sunnySunny 不会重复出现。
那么如何在 PostgreSQL 中为两列查找所有可能的重复项。

最佳答案

lower()/upper()

使用其中一个将字符折叠为小写或大写。特殊字符不受影响:

SELECT count(*), lower(name), number
FROM   tbl
GROUP  BY lower(name), number
HAVING count(*) > 1;

unaccent()

如果您真的想忽略变音符号,就像您的评论暗示的那样,请安装附加模块 unaccent ,它提供了一个文本搜索字典,可以删除重音符号以及通用函数 unaccent():

CREATE EXTENSION unaccent;

让它变得非常简单:

SELECT lower(unaccent('Büßercafé'));

结果:

busercafe

这不会去除非字母。添加 regexp_replace() 就像 @Craig 提到的那样:

SELECT lower(unaccent(regexp_replace('$s^o&f!t Büßercafé', '\W', '', 'g') ));

结果:

softbusercafe

您甚至可以在此基础上构建功能索引:

关于sql - 在忽略大小写和特殊字符的两列中查找可能的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12979390/

相关文章:

sql - 如何将个位数值转换为sqlite3支持的日期格式? [ 值 0 填充]

PostgreSQL WHERE IN 子句

python - SQLAlchemy 中的整数字段不自动递增

删除 R 中的 "semi-duplicate"行

MySQL:选择属于不同用户的电话

javascript - 如何仅在 Javascript 中制作另一个数组的重复值的数组?

mysql - 如何在 SET 子查询中引用外表?

SQLite 到 Postgres 层次结构查询

php - SQL JOIN 失败的问题

sql - 您会推荐哪些优化工作来加速 PostgreSQL 中的查询执行?