Я не собираюсь предполагать, что у id
нет пробелов. Один метод использует lag()
:
select t.*
from (select t.*,
lag(text) over (order by id) as prev_text,
lag(text, 2) over (order by id) as prev_text2,
lag(text, 3) over (order by id) as prev_text3
from t
) t
where text like '%bc%' or
prev_text like '%bc%' or
prev_text2 like '%bc%' or
prev_text3 like '%bc%';
Вы также можете сделать это с одним сравнением, используя другие функции окна:
select id, text
from (select t.*,
sum( (text like '%bc%')::int ) over (order by id rows between 3 preceding and current row) as cnt
from t
) t
where cnt > 0;
С индексом id
это может быть самый быстрый подход к решению проблемы.