MySQL - вернуть список слов, которые появляются непосредственно перед словом интереса - PullRequest
1 голос
/ 16 апреля 2020

По сути, у меня есть столбец длинных текстовых значений, например:

ID | text 
0  | Hi my name is Brian.
1  | I think Brian sucks.

И я хочу написать функцию, которая возвращает список слов, которые идут прямо перед «интересующим словом». Поэтому, если бы я искал «Брайан», функция вернула бы «есть» и «подумать», потому что оба слова появляются прямо перед «Брайаном». У меня есть этот код, но он не работает:

select case when (select w.t regexp concat('[[:<:]]', w.v)) = 1 
    then substr(w.t, 1, locate(w.v, w.t)-1) else null end as 'left_word',
       w.v as word
    from (
        select text from table as t, "Brian" as v
    ) as w;

Есть идеи?

Ответы [ 2 ]

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

В вашем запросе есть синтаксическая ошибка:

select text from table as t, "Brian" as v

должно быть:

select text as t, "Brian" as v from table

Как только вы исправите это, вы получите:

Hi my name is
I think

Затем вы можете использовать SUBSTRING_INDEX для извлечения последнего слова из этих строк:

select case when w.t regexp concat('[[:<:]]', w.v, '[[:>:]]') 
            then substring_index(substr(w.t, 1, locate(w.v, w.t)-2), ' ', -1)
            else null
       end as 'left_word',
       w.v as word
from (
  select text as t, "Brian" as v
  from `table`
) as w;

Вывод:

left_word   word
is          Brian
think       Brian

Демонстрация по SQLFiddle

Примечание для MySQL> 8.0.4, вам нужно использовать \\b в качестве границы слова вместо [[:<:]] и [[:>:]], чтобы ваш запрос стал

select case when w.t regexp concat('\\b', w.v, '\\b') 
            then substring_index(substr(w.t, 1, locate(w.v, w.t)-2), ' ', -1)
            else null
       end as 'left_word',
       w.v as word
from (
  select text as t, "Brian" as v
  from `table`
) as w;

Демонстрация на dbfiddle

0 голосов
/ 16 апреля 2020

Привет, не могли бы вы попробовать этот запрос?

    select 
    SUBSTRING_INDEX(SUBSTRING_INDEX(text, 'Brian', 1),' ',-2) 
    from `table` 
    where text LIKE '%Brian%'

Надеюсь, это поможет!

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