Sql-запросы, которые занимают несколько строк и их подстрока - PullRequest
0 голосов
/ 03 марта 2019
| 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     |

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Примерно так же для одного поискового запроса.

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;

Может быть, прибегнуть к UNION ALL для объединения нескольких поисков в один набор результатов.

NB Я изменил ваш пример с предполагаемыми смещениями и установил @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 |
+----+-----------------+--------+
0 голосов
/ 03 марта 2019

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...