Как я могу использовать ~ для нечеткого сопоставления двух полей таблицы?

Я пытаюсь выполнить объединение двух таблиц, содержащих информацию об одних и тех же компаниях, но иногда компании хранятся с немного разными именами (например, таблица 1: Компания X -> Таблица 2: Компания X и друзья). Моя идея состояла в том, чтобы полностью соединить каждую строку таблицы 1 с каждой строкой таблицы 2, а затем использовать ~ для фильтрации (например, где имя1 ~ имя2 или имя2 ~ имя1), но это невозможно.

У кого-нибудь есть решение этой проблемы соответствия? Спасибо!


person Edoardo Albergo    schedule 03.09.2019    source источник


Ответы (3)


Вы можете присоединиться при условии, что любое поле имени будет подстрокой другого поля имени:

SELECT t1.*, t2.*
FROM table1 t1
INNER JOIN table2 t2
    ON t1.name LIKE '%' || t2.name || '%' OR
       t2.name LIKE '%' || t1.name || '%';

Этот подход даже не требует регулярного выражения. Мы могли бы использовать здесь регулярное выражение, если бы хотели, чтобы имя одной таблицы отображалось только как подстрока имени другой таблицы и также было словом. Но, возможно, вам даже не нужно этого делать.

person Tim Biegeleisen    schedule 03.09.2019

Вы можете использовать оператор «‹->» или оператор «%», предоставляемый pg_trgm для нечеткого сопоставления строк.

Вы должны принять решение, например, какое отсечение подобия вы готовы использовать для «%» (не возвращать совпадений, если лучшее совпадение ниже этого) и хотите ли вы вернуть только верхнее совпадение (боковые соединения хороши для этого) или возможное больше одного.

Вероятно, будет лучше использовать это для очистки ваших данных, а не включать их напрямую в рабочее приложение.

Возможно, вам также придется убрать неприятные слова. «Компания X и друзья» будет больше похожа на «Компания Y и друзья», чем на «Компания X с ограниченной ответственностью».

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;
person jjanes    schedule 03.09.2019

Ты мог

CREATE EXTENSION pg_trgm;

и используйте оператор подобия, который он предоставляет в условии соединения:

t1 JOIN t2 ON t1.name % t2.name
person Laurenz Albe    schedule 03.09.2019