回答

收藏

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

技术问答 技术问答 217 人阅读 | 0 人回复 | 2023-09-14

询问SELECT COUNT(*),name,numberFROM   tblGROUP  BY name,numberHAVING COUNT(*) > 1有时候小写和大写之间找不到重复项。, B; ?7 ]( T# ~3 c. Y4 ~  _; h
例如:sunny并且Sunny不显示为重复项。
9 b( [9 O# K# M, e所以,怎么在PostgreSQL在两列中找到所有可能的重复项。
: ~/ q* T: d/ ]* {; V1 P) {                                                                6 l; g" J- M& G* Q/ J. {* W1 g
    解决方案:                                                                " C" w4 f" h3 Z
                                                                [lower()](http://www.postgresql.org/docs/current/interactive/functions-string.html#FUNCTIONS-STRING-SQL)/
" t7 y+ `) Y& m2 qupper()
! K- J4 ?8 g6 A3 L1 y# E0 A将字符折叠成小写或大写。特殊字符不受影响:' s7 [+ G) c6 N1 @4 i) s
SELECT count(*),lower(name),numberFROM   tblGROUP  BY lower(name),numberHAVING count(*) > 1;unaccent()
# @, x' {; ], Y0 L/ R如果您实际上想忽略变音符号(如您的注释所示),请安装附加模块unaccent,该模块提供了一个文本搜索字典,可以删除重音符号和通用功能unaccent():
) S8 r; E3 P" e$ C7 m8 ICREATE EXTENSION unaccent;让它很简单:
7 ?& h0 b6 l+ o9 a% [; S/ ySELECT lower(unaccent('B眉脽ercaf茅')) AS norm结果:( u3 X" d9 y# \  ^8 R* n
busercafe这不会去除非字母。添加regexp_replace()像@Craig提到的:
) r  A7 ~% a/ oSELECT lower(unaccent(regexp_replace('$s^o&f!t B眉脽ercaf茅','\Wg )))                                                                                                                                                                                                            AS norm结果:$ F+ q7 r( N. {: B; m
softbusercafe
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则