如何使用postgresql在一列中查找类似的值

我是SQL的新手,因此我对它的功能不是很熟悉.

所以这是我的问题.

我的下表包含> 100.000公司(让我们称之为’comp’):

id  | title               | name
----+---------------------+--------------
1   | XYZ                 | xyz
----+---------------------+--------------
2   | Smarts              | smarts
----+---------------------+--------------
3   | XYZ LTD             | xyzltd
----+---------------------+--------------
4   | Outsmarts           | outsmarts
----+---------------------+--------------
5   | XYZ Entertainment   | xyzentertainment
----+---------------------+--------------
6   | Smarts Entertainment| smartsentertainment

其中’title’是公司名称,’name’是相同的标题,但是没有空格.
有没有办法找到所有具有相似头衔的公司(使用’title’或’name’)?所以,基本上,我想收到:

id  | title               | name
----+---------------------+--------------
1   | XYZ                 | xyz
----+---------------------+--------------
3   | XYZ LTD             | xyzltd
----+---------------------+--------------
5   | XYZ Entertainment   | xyzentertainment
----+---------------------+--------------
2   | Smarts              | smarts
----+---------------------+--------------
6   | Smarts Entertainment| smartsentertainment

我的意思是:
1)’XYZ’,’XYZ LTD’和’XYZ Entertainment’
2)’智能’和’智能娱乐’
但’XYZ Entertainment’与’Smart Entertainment’并不相似,’Smart’与’Outsmarts’不相似.

我尝试过这个并没有用:

SELECT set_limit(0.8);

SELECT
  similarity(c1.name, c2.name) AS sim,
  c1.name,
  c2.name
FROM comp AS c1
  JOIN comp AS c2
    ON c1.name != c2.name
       AND c1.name % c2.name
ORDER BY sim DESC;

通过’没有工作’我的意思是在7分钟后它仍然没有给我任何结果.我想,我完全搞砸了
是否有可能找回这样的相似之处?

最佳答案 您可以尝试
Levenshtein distance功能,它可以为您提供从第一个参数获得第二个的编辑次数:

SELECT levenshtein(c1.name, c2.name) AS sim, 0c1.name, c2.name
FROM comp AS c1 JOIN comp AS c2 ON c1.name != c2.name ORDER BY sim DESC;
点赞