PostgreSQL如何统一大小写敏感的同名条目合并重复节点
解决方案
不需要用复杂正则重命名,直接用PostgreSQL原生大小写转换函数统一字段格式即可,逻辑简单、性能远高于正则处理。
推特用户名本身规则为大小写不敏感,你只需要把参与节点唯一判定的两列值统一转为全小写(或全大写,规则保持一致即可),就能自动合并所有大小写变体的同名字段,不会再识别为独立节点。
最简修改版(直接输出可用的关系数据)
对现有查询的两列输出统一做小写转换,返回结果可以直接用于关系网络构建:
with cte as ( select lower(u.twitter_name) as twitter_name, REGEXP_MATCHES(t.txt, '@([A-Za-z0-9_]+)', 'g') as mentions from tweet as t, twitter_user as u where t.author_id = u.id ) select twitter_name, lower(unnest(mentions)) as unnest from cte;
基于你给出的示例数据,查询输出会自动合并为:
| twitter_name | unnest |
|---|---|
| apple | flower |
| apple | bug |
| banana | bug |
| banana | flower |
| banana | leaf |
所有大小写形式的banana都会被识别为同一个节点。
保留原始大小写的版本
如果构建网络时需要保留原始文本的大小写格式做展示,可以在查询中同时输出「节点唯一标识(全小写)」和「原始展示值」两类字段:节点去重、边关联逻辑用全小写ID判定,页面展示时取原始值即可,参考SQL如下:
with cte as ( select u.twitter_name as raw_twitter_name, lower(u.twitter_name) as node_twitter_id, REGEXP_MATCHES(t.txt, '@([A-Za-z0-9_]+)', 'g') as mentions from tweet as t, twitter_user as u where t.author_id = u.id ) select raw_twitter_name, node_twitter_id, unnest(mentions) as raw_mention_name, lower(unnest(mentions)) as node_mention_id from cte;
长期场景优化
如果后续需要长期做这类用户名的大小写不敏感查询、关联,可以启用PostgreSQL自带的citext扩展,将存储用户名的字段类型设置为citext,之后所有查询、关联操作默认大小写不敏感,不需要每次手动加lower()处理。该方案需要修改表结构,适合稳定的长期业务场景;如果只是临时导出关系数据,用前面的lower()处理方案即可,没有额外依赖,改造成本最低。
内容的提问来源于stack exchange,提问作者sppokky
相关产品推荐
相关产品推荐

