Условное текстовое соединение по столбцам в MySQL. Некоторые фразы точного соответствия и другие регулярные выражения

0

Я пытаюсь присоединиться к двум таблицам - позвоните им table1 и table2 - в MySQL на основе текстового столбца в каждой таблице. table1.text - это все предложения, и мне нужно присоединиться к table2.text где слово или фраза из table2.text появляется в предложении для первой.

table2.text часть заключается в том, что фраза из table2.text окружена **, тогда она должна быть точным соответствием для этого слова. Если нет, и это просто нормальная фраза, это может быть регулярное совпадение - поэтому такое слово, как can в table2.text будет соответствовать предложению, которое у I have cans в table1.text. Однако **can** в table2.text бы у I have cans не I have cans в table1.text.

До сих пор я думал об этом:

select a.text, replace(b.text,'**',' ')
from table1 a join
     table2 b 
      on a.text like CONCAT('%', b.text, '%');

Но это не учитывает ** слова, которые появляются в начале предложения или перед пунктуацией. Есть идеи?

Теги:
join

2 ответа

1
Лучший ответ

Этот запрос будет делать то, что вы хотите. Он проверяет значение table2.text чтобы увидеть, соответствует ли оно **word**, а если нет, просто использует LIKE чтобы посмотреть, находится ли это слово в table1.text. Если table2.text соответствует table2.text **word**, он использует тест REGEXP чтобы гарантировать, что table2.text возникает только в table1.text как целое слово (используя [[:<:]] и [[:>:]] разделителей слов). Я привел некоторые примеры данных для демонстрации в этом SQLFiddle.

SELECT a.text, REPLACE(b.text, '**', '')
FROM table1 a
JOIN table2 b
ON b.text NOT REGEXP('\\*\\*[a-z]+\\*\\*') AND a.text LIKE CONCAT('%', b.text, '%') OR
   a.text REGEXP CONCAT('[[:<:]]', REPLACE(b.text, '**', ''), '[[:>:]]')
0

Если я выясню вашу проблему, возможно, это будет что-то вроде этого.

SELECT a.text, replace(b.text,'**',' ')
FROM table1 a, table2 b
WHERE REGEXP_LIKE (a.text, b.text);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню