Сравнение строковых значений в таблице - PullRequest
1 голос
/ 25 мая 2020

Есть ли способ сравнить два столбца со строками друг с другом и получить совпадения?

У меня есть два столбца, содержащие имена, один раз с полным именем, другой с (в основном) только фамилией.

Я только что попробовал с soundex, но он просто вернет, если значения почти одинаковы в обоих столбцах.

SELECT * FROM TABLE
WHERE soundex(FullName) = soundex(Surname)
1   John Doe       Doe 
2   Peter Parker   Parker
3   Brian Griffin  Brian Griffin

с soundex он будет соответствовать только третьей строке.

Ответы [ 3 ]

1 голос
/ 25 мая 2020

Простой вариант - использовать instr, который показывает, существует ли surname в fullname:

SQL> with test (id, fullname, surname) as
  2    (select 1, 'John Doe'     , 'Doe'           from dual union all
  3     select 2, 'Peter Parker' , 'Parker'        from dual union all
  4     select 3, 'Brian Griffin', 'Brian Griffin' from dual
  5    )
  6  select *
  7  from test
  8  where instr(fullname, surname) > 0;

        ID FULLNAME      SURNAME
---------- ------------- -------------
         1 John Doe      Doe
         2 Peter Parker  Parker
         3 Brian Griffin Brian Griffin

Другой вариант - использовать одну из функций UTL_MATCH, например Сходство Яро-Винклера, которое показывает, насколько хорошо эти строки соответствуют :

SQL> with test (id, fullname, surname) as
  2    (select 1, 'John Doe'     , 'Doe'           from dual union all
  3     select 2, 'Peter Parker' , 'Parker'        from dual union all
  4     select 3, 'Brian Griffin', 'Brian Griffin' from dual
  5    )
  6  select id, fullname, surname,
  7    utl_match.jaro_winkler_similarity(fullname, surname) jws
  8  from test
  9  order by id;

        ID FULLNAME      SURNAME              JWS
---------- ------------- ------------- ----------
         1 John Doe      Doe                   48
         2 Peter Parker  Parker                62
         3 Brian Griffin Brian Griffin        100

SQL>

Не стесняйтесь исследовать другие функции, которые предлагает пакет.


Также обратите внимание, что Я не обратил внимания на возможные различия в регистре букв (например, «DOE» и «Doe»). Если вам это тоже нужно, сравните, например, upper(surname) с upper(fullname).

0 голосов
/ 25 мая 2020

Используйте функцию ввода,

SELECT * FROM TABLE
WHERE instr(Surname, FullName) > 0;


SELECT * FROM TABLE
WHERE instr(upper(Surname), upper(FullName)) > 0;

SELECT * FROM TABLE
WHERE upper(FullName) > upper(Surname);
0 голосов
/ 25 мая 2020

Насколько я знаю, нет ничего нестандартного, когда сопоставление усложняется. Однако для показанных случаев достаточно следующего выражения:

where fullname like '%' || surname

Обновление

Основная проблема может заключаться в ложных срабатываниях:

  • Фамилия ' Парк »появляется в« Питере Паркере ». Вышеупомянутый запрос решает эту проблему, глядя на конец полного имени.

Другая проблема может заключаться в верхнем / нижнем регистре, как указано в других ответах (не показано в ваших данных примера).

  • Вы хотите, чтобы фамилия 'PARKER' соответствовала 'Peter Parker'.

Но если смотреть на регистр строк без учета регистра, возникает другая проблема:

  • Последний имя «Strong» внезапно будет соответствовать «Louis Armstrong».

Решением для этого является добавление пробела, чтобы изменить ситуацию:

where ' ' || upper(fullname) like '% ' || upper(surname)
  • ' LOUIS ARMSTRONG' like '% STRONG' -> ложь
  • ' LOUIS ARMSTRONG' like '% ARMSTRONG' -> истина
  • ' LOUIS ARMSTRONG' like '% LOUIS ARMSTRONG' -> истина

Демо: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=0ac5c80061b4aeac1153a8c5976e6e54

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...