我需要根据名称加入两个表。问题是名称可能在其中一个数据库中有轻微的错误。我过去使用Stata和Python的模糊合并来解决这个问题,其中名称根据它们的相似程度进行匹配,但我想知道这是否可以在Postgresql中进行。
例如,数据可能与此类似:
表A:
first_name_a | last_name_a | id_a ---------------------------------- William | Hartnell | 1 Matt | Smithe | 2 Paul | McGann | 3 David | Tennant | 4 Colin | Baker | 5
表B:
first_name_b | last_name_b | id_b ---------------------------------- Matt | Smith | a Peter | Davison | b Dave | Tennant | c Colin | Baker | d Will | Hartnel | e
最后,我希望我的结果看起来像:
first_name_a | last_name_a | id_a | first_name_b | last_name_b | id_b ---------------------------------------------------------------------- William | Hartnell | 1 | Will | Hartnel | e Matt | Smithe | 2 | Matt | Smith | a Paul | McGann | 3 | | | David | Tennant | 4 | Dave | Tennant | c Colin | Baker | 5 | Colin | Baker | d | | | Peter | Davison | b
我的声波螺丝刀给了我一些像这样的伪代码:
SELECT a.*, b.* FROM A a JOIN B b WHERE LEVENSHTEIN(first_name_a, first_name_b) IS LESS THAN 1 AND LEVENSHTEIN(last_name_a, last_name_b) IS LESS THAN 1
答案 0 :(得分:2)
你提到的DML:
SELECT a.*, b.* FROM A a
JOIN B b
WHERE LEVENSHTEIN(first_name_a, first_name_b) IS LESS THAN 1
AND LEVENSHTEIN(last_name_a, last_name_b) IS LESS THAN 1
看起来是正确的,只是提高了'模糊性'(给出'不到1'代替1你所需要的'模糊'水平)
有关LEVENSHTEIN的参考信息,请参阅http://www.postgresql.org/docs/9.1/static/fuzzystrmatch.html。
答案 1 :(得分:0)
完成SQLFiddle。使用阈值/查看matching fuzzy strings中提到的一些其他映射函数。