Sql 如何使用levenstein条件语句和百分比内部联接两个表

Sql 如何使用levenstein条件语句和百分比内部联接两个表,sql,database,postgresql,postgresql-9.1,Sql,Database,Postgresql,Postgresql 9.1,下面的脚本返回我正在查找的内容,这是一个内部联接,用于查找两个表中相似的数据 SELECT zip_codes.building_name, test_1_2.poiname_c_132, zip_codes.street_name, test_1_2.streetname_c_35 FROM zip_codes INNER JOIN test_1_2 ON (levenshtein(replace(zip_codes.building_name, ' ',''),replace(test_1

下面的脚本返回我正在查找的内容,这是一个内部联接,用于查找两个表中相似的数据

SELECT zip_codes.building_name, test_1_2.poiname_c_132, zip_codes.street_name, test_1_2.streetname_c_35 FROM zip_codes INNER JOIN test_1_2
 ON (levenshtein(replace(zip_codes.building_name, ' ',''),replace(test_1_2.poiname_c_132, ' ',''))
  < 2)
  AND
   (levenshtein(replace(zip_codes.street_name, ' ',''),replace(test_1_2.streetname_c_35, ' ',''))
    < 4); 
从邮政编码内部连接测试中选择邮政编码、建筑名称、测试名称、测试名称、邮政编码、街道名称、测试名称、街道名称和测试35
在(levenshtein)(替换(邮政编码.建筑名称,'',''),替换(测试名称,'')
< 2)
及
(levenshtein(替换(邮政编码、街道名称、“”)、替换(测试1、2、街道名称、c_35、“”))
< 4); 
在那之后,我试着让内部连接返回一个百分比,该百分比需要低于找到要连接的百分比,但我没有得到正确的输出

SELECT zip_codes.building_name, test_1_2.poiname_c_132, zip_codes.street_name, test_1_2.streetname_c_35 FROM zip_codes INNER JOIN test_1_2
 ON (levenshtein(replace(zip_codes.building_name, ' ',''),replace(test_1_2.poiname_c_132, ' ',''))
 /GREATEST(char_length(replace(test_1_2.poiname_c_132,' ','')), char_length(replace(zip_codes.building_name,' ','')))
  < 2/GREATEST(char_length(replace(test_1_2.poiname_c_132,' ','')), char_length(replace(zip_codes.building_name,' ',''))))
  AND
   (levenshtein(replace(zip_codes.street_name, ' ',''),replace(test_1_2.streetname_c_35, ' ',''))/GREATEST(char_length(replace(test_1_2.streetname_c_35,' ','')), char_length(replace(zip_codes.street_name,' ','')))
    < 4/GREATEST(char_length(replace(test_1_2.streetname_c_35,' ','')), char_length(replace(zip_codes.street_name,' ','')))); 
从邮政编码内部连接测试中选择邮政编码、建筑名称、测试名称、测试名称、邮政编码、街道名称、测试名称、街道名称和测试35
在(levenshtein)(替换(邮政编码.建筑名称,'',''),替换(测试名称,'')
/最大(字符长度(替换(测试1、2、poiname、c、132、“”))、字符长度(替换(邮政编码、建筑名称、“”)))
<2/最大长度(字符长度(替换(测试1\u 2.poiname\u c\u 132,,'')、字符长度(替换(邮政编码.建筑名称,,''))
及
(levenshtein(替换(邮政编码.街道名称,'',''),替换(测试1.街道名称.街道名称,'','')/最大(字符长度(替换(测试1.街道名称.街道名称,''),''),字符长度(替换(邮政编码.街道名称,'',''))
<4/最大(字符长度(替换(测试1、2、街道名称、c、35、“”))、字符长度(替换(邮政编码、街道名称、35、“”));

有什么想法吗?

你所做的听起来像是一个非常非常慢的查询的回应。您正在有效地计算表中所有记录组合之间的levenshtein距离。如果您知道10.000个zipcodes,并且在另一个表中有1000条记录,那么数据库必须解析10.000.000个组合,每个组合计算四次levenshtein

如果levenshtein必须在两个字符的距离内,则sting的长度差异也不能超过两个字符。考虑到大多数字符串的差异更大,您甚至可以在前往levenshtein之前使用快速且不可执行的WHERE条件删除它们


至于你关于百分比的问题,你到底想得到什么?所有两个字段的差异小于X%的组合?

我该如何在…(Noob,对不起)中添加WHERE条件?这个编辑器快把我累死了:-)您只需告诉数据库条件是什么:长度的差异可能不会超过两个,所以长度(table_a.field)-长度(table_b.field)不能大于2或小于-2。类似于:从a.Something=b.Something上的内部连接b中选择*,其中ABS(长度(a.field)-长度(b.field))