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

Gho*_*man 7 sql postgresql case-insensitive duplicates pattern-matching

询问

SELECT COUNT(*), name, number
FROM   tbl
GROUP  BY name, number
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)

它有时无法在小写和大写之间找到重复.
例如:sunny并且Sunny不会显示为重复项.
那么如何在PostgreSQL中为两列找到所有可能的重复项.

Erw*_*ter 16

lower()/ upper()

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

SELECT count(*), lower(name), number
FROM   tbl
GROUP  BY lower(name), number
HAVING count(*) > 1;
Run Code Online (Sandbox Code Playgroud)

unaccent()

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

CREATE EXTENSION unaccent;
Run Code Online (Sandbox Code Playgroud)

使它非常简单:

SELECT lower(unaccent('Büßercafé')) AS norm
Run Code Online (Sandbox Code Playgroud)

结果:

busercafe
Run Code Online (Sandbox Code Playgroud)

这不会删除非字母.regexp_replace()像@Craig那样添加:

SELECT lower(unaccent(regexp_replace('$s^o&f!t Büßercafé', '\W', '', 'g') ))
                                                                     AS norm
Run Code Online (Sandbox Code Playgroud)

结果:

softbusercafe
Run Code Online (Sandbox Code Playgroud)

您甚至可以在其上构建功能索引: