Postgresql 如何使用~模糊匹配表的两个字段?

Postgresql 如何使用~模糊匹配表的两个字段?,postgresql,join,string-matching,similarity,fuzzy,Postgresql,Join,String Matching,Similarity,Fuzzy,我试图对包含相同公司信息的两个表执行联接,但有时这些公司的存储名称略有不同(例如,表1:Company X->表2:Company X和Friends)。 我的想法是将表1的每一行与表2的每一行完全联接,然后使用~进行筛选(例如,where name1~name2或name2~name1),但这是不可能的 有人能解决这个匹配问题吗? 谢谢 您可以加入,条件是任一名称字段都是另一个名称字段的子字符串: SELECT t1.*, t2.* FROM table1 t1 INNER JOIN tabl

我试图对包含相同公司信息的两个表执行联接,但有时这些公司的存储名称略有不同(例如,表1:Company X->表2:Company X和Friends)。 我的想法是将表1的每一行与表2的每一行完全联接,然后使用~进行筛选(例如,where name1~name2或name2~name1),但这是不可能的

有人能解决这个匹配问题吗?
谢谢

您可以加入,条件是任一名称字段都是另一个名称字段的子字符串:

SELECT t1.*, t2.*
FROM table1 t1
INNER JOIN table2 t2
    ON t1.name LIKE '%' || t2.name || '%' OR
       t2.name LIKE '%' || t1.name || '%';
这种方法甚至不需要正则表达式。如果我们想确保一个表的名称只显示为另一个表名称的子字符串,并且也是一个单词,那么我们可以在这里使用regex。但是,也许你甚至不需要这样做。

你可以

CREATE EXTENSION pg_trgm;
并使用它在连接条件中提供的相似性运算符:

t1 JOIN t2 ON t1.name % t2.name
您可以使用提供的“”运算符或“%”运算符进行模糊字符串匹配

您必须做出决定,比如您愿意为“%”使用什么样的相似度截止点(如果最佳匹配低于该值,则不返回匹配项),以及是否只返回顶部匹配项(横向连接适用于此),或者可能返回多个匹配项

最好使用它来清理数据,而不是直接将其合并到生产应用程序中

你可能还需要去掉讨厌的词。“X公司和朋友”将比“X公司有限公司”更类似于“Y公司和朋友”

选择t1.*,t2.*,1-(t1.name t2.name)作为相似度
来自表1 t1
内连接表2 t2
在t1.name%t2.name上
按t1.name t2.name排序;
SELECT t1.*, t2.*, 1- (t1.name <-> t2.name) as similarity
FROM table1 t1
INNER JOIN table2 t2
    ON t1.name % t2.name
order by t1.name <-> t2.name;