Выберите, где любое слово в строке столбца A соответствует любому слову в строке столбца B - PullRequest
2 голосов
/ 21 апреля 2020

Я искал на сайте некоторые указания, но не смог найти что-то подходящее. Мне было интересно, если есть способ выбрать строки, где "любое слово в строке в столбце A соответствует любому слову в строке в столбце B"? Я использую postgresql.

ID | Name              | Name_of_kin 
1  | Peter Reeves      | John Reeves
2  | Emily Sanchez     | Roger James
3  | Rico van Der      | Moses van Fel
4  | Monic             | Monica
5  | Michaelangelo     | Michael

В этом сценарии я хочу выбрать строки, в которых любое слово в Name_of_kin соответствует любому слову в Name. Результат, который я надеюсь достичь:

ID | Name              | Name_of_kin 
1  | Peter Reeves      | John Reeves
3  | Rico van Der      | Moses van Fel

Большое спасибо заранее!

Ответы [ 2 ]

3 голосов
/ 21 апреля 2020

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

select t.*
from mytable t
where string_to_array(t.name, ' ') && string_to_array(t.name_of_kin, ' ')

Демонстрация на DB Fiddle :

id | name         | name_of_kin  
-: | :----------- | :------------
 1 | Peter Reeves | John Reeves  
 3 | Rico van Der | Moses van Fel

В Snowflake вы бы написали это как:

select t.*
from mytable t
where array_overlap(split(t.name, ' '), split(t.name_of_kin, ' '))
0 голосов
/ 21 апреля 2020

Вы можете сделать это с помощью регулярных выражений:

select t.*
from mytable t
where t.name ~ ('(\W|^)' || replace(t.name_of_kin, ' ', '(\W|$)|(\W|^)') || '(\W|$)');

Или:

select t.*
from mytable t
where ' ' || t.name || ' ' ~ (' ' || replace(t.name_of_kin, ' ', ' | ') || ' ')

Или:

select t.*
from mytable t
where t.name ~ replace(t.name_of_kin, ' ', '|') and
      t.name_of_kin ~ replace(t.name, ' ', '|');

Здесь is дб <> скрипка.

...