Sql-запросы, охватывающие несколько строк и их подстроки

#mysql #sql

#mysql #sql

Вопрос:

 | id | caption         | offset |
|----|-----------------|--------|
| 1  | The quick fox   | 0      |
| 2  | jumped over the | 14     |
| 3  | lazy fox. The   | 30     |
| 4  | cow jumped over | 44     |
| 5  | the moon        | 52     |
  

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

Запрос, который я выполняю с помощью elastic, возвращает смещение всего блока текста, объединенного вместе, например:

 {
  searchQuery: 'over the lazy fox.',
  beginning: 21,
  end: 34
}
  

Начало и конец должны проверяться с помощью смещения; любые, которые попадают между этими
в возвращаемые данные должны быть включены два числа. Чтобы усложнить задачу, я бы также хотел, чтобы соответствующая часть текста соответствовала. Важно, чтобы каждая из строк хранилась отдельно, поскольку здесь опущена дополнительная информация о строке.

 | id | caption         | highlight |
|----|-----------------|-----------|
| 2  | jumped over the | over the  |
| 3  | lazy fox. The   | lazy fox. |
  

Я также хотел бы иметь возможность выделять несколько поисковых запросов одновременно, если был предоставлен массив начал и концов, возвращать все совпадающие строки и подстроки.

Комментарии:

1. можете ли вы немного подробнее объяснить сценарий с массивом? Кроме того, я чувствую, что ваш пример неверен, поскольку end is 34 тогда highlight только совпадает lazy .

Ответ №1:

Что-то вроде этого для одного поискового запроса.

 SELECT 
    id,
    caption,
    LEFT(RIGHT(caption, offset   LENGTH(caption) - @beginning), @end - offset) AS highlight
FROM some_table
WHERE offset   LENGTH(caption) >= @beginning 
AND offset <= @end;
  

Возможно, прибегнуть к ОБЪЕДИНЕНИЮ ALL для объединения нескольких поисковых запросов в один набор результатов.

Примечание Мне пришлось изменить ваш пример, указав, как я полагаю, предполагаемые смещения, и установить @end значение 38, чтобы получить ожидаемый набор результатов.

  ---- ----------------- -------- 
| id | caption         | offset |
 ---- ----------------- -------- 
|  1 | The quick fox   |      0 |
|  2 | jumped over the |     14 |
|  3 | lazy fox. The   |     29 |
|  4 | cow jumped over |     42 |
|  5 | the moon        |     57 |
 ---- ----------------- -------- 
  

Ответ №2:

Для сценария с одним поиском,

 SELECT 
    *
    ,IF(@beginning >= offset
                ,RIGHT(caption,len(caption)-(@beginning-offset))
                ,LEFT(caption,@end-offset)) as highlight
from @table
WHERE offset >= (select MAX(offset) from @table where offset <= @beginning)
    and offset <= @end
  

Для сценария поиска по массиву,

 SELECT 
t.*
,IIF(_beginning >= offset
            ,RIGHT(caption,len(caption)-(_beginning-offset))
            ,LEFT(caption,_end-offset)) as highlight
,a.id
from @table t
    join @array a ON offset >= (select MAX(offset) from @table where offset <= _beginning)
        and offset <= _end
order by a.id asc
  

вставьте значения для поиска в следующей таблице (переменная) перед выполнением второго запроса,

 declare @array as table(id int, _beginning int, _end int)