совпадение подстроки в обеих таблицах объединения - PullRequest
0 голосов
/ 01 мая 2018

Как я могу выполнить соединения на совпадении подстроки с другой подстрокой Кажется, я могу только ilike искать по одному или другому, но не искать по подстроке оба.

Данные таблицы:

ДИАЛОГ

string             
-------------------
Hi, my name is dan

КОНСТРУКЦИЯ

structure
----------
his name is / my name is
hello, my / you are
how are you?

ОЖИДАЕМЫЙ ВЫХОД:

string              | structure
-------------------------------
Hi, my name is dan  | his name is / my name is

Попытки:

Два ilike нечетких совпадения:

select string, structure from dialog left join structures on ('%' || string || '%' ilike '%' || structure || '%');

Два нечетких ilike совпадения с OR:

select string, structure from dialog left join structures on (string ilike '%' || structure || '%') or (structure ilike '%' || string || '%');

Оба выхода:

string              | structure
-------------------------------
Hi, my name is dan  |

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

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

select string, structure
from dialog d left join
     structures s
     on string ~ replace(string, ' / ', '|');

Конечно, это не работает с примерами данных, потому что строки на самом деле не совпадают.

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

0 голосов
/ 01 мая 2018

Сначала выполните декартово произведение, ограниченное предложением WHERE, чтобы увидеть, каких результатов вы можете ожидать.

select string, structure from dialog CROSS join structures WHERE string ilike '%' || structure || '%' AND structure ilike '%' || string || '%'

Я думаю, что ваша попытка левого соединения не совпадает ни с чем, потому что в левой части инструкции ILIKE есть символы подстановки. Это, на самом деле, буквально. Также используйте «И» для объединения: вы хотите пары, где оба предиката верны. Перекрестное соединение хорошо подходит здесь, поскольку вы довольно плотно определяете условие where.

Левое объединение будет использоваться только в том случае, если вы хотите, чтобы ваш диалог полностью связывался с опционально «структурой». В этом случае выполните «полное объединение», чтобы вы могли точно определить, какие совпадения сделаны. Позже вы можете решить отфильтровать все и поместить предикаты предложения where в подходящее предложение соединения.

...