Сопоставить данные столбцов с допуском - PullRequest
1 голос
/ 04 июня 2019

хорошо, у меня есть требование сопоставить адресные данные в двух таблицах в базе данных oracle с допуском 2. Значение при сопоставлении значений 'abc de fghij' и 'abd el fghij' должно возвращать true.и эти 2 разных персонажа могут быть где угодно, могут быть в разных местах и ​​могут быть отделены друг от друга.Я гуглил и гуглял, но не мог найти функцию или логику для чего-либо подобного.Может кто-нибудь, пожалуйста, подскажите мне, где это посмотреть.

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Пример:

with t(a, b) as ( 
  select 'abc de fghij', 'abd el fghij' from dual union all
  select '1234', '456784' from dual )
select a, b, 
       length(trim(translate(a, b, ' '))) ab,
       length(trim(translate(b, a, ' '))) ba
  from t

Возвращает:

A            B                    AB         BA
------------ ------------ ---------- ----------
abc de fghij abd el fghij          1          1
1234         456784                3          4

, что означает, что в строке 1 есть один символ в A, который отсутствует в B, и один в B, который отсутствует в A.

Если с этой логикой все в порядке, напишите ваш запрос как:

select a, b
  from t
  where length(trim(translate(a, b, ' '))) + length(trim(translate(b, a, ' '))) <= 2
0 голосов
/ 04 июня 2019

Я думаю, вы можете использовать UTL_MATCH.EDIT_DISTANCE('abc de fghij', 'abd el fghij') для вашей проблемы. Это вычисляет Levenshtein Distance между двумя строками.

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

Таким образом, окончательный запрос может выглядеть так:

SELECT * FROM <TABLE> WHERE UTL_MATCH.EDIT_DISTANCE(<COLUMN>, :PARAMETER) <= 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...