SQLite: выберите X записей вокруг строки с определенным идентификатором в соответствии с инструкцией ORDER

#android #sql #sqlite #cursor #range

#Android #sql #sqlite #курсор #диапазон

Вопрос:

Я знаю, что могу выбрать следующую или предыдущие X записей с помощью инструкций, подобных следующим:

 Next:     `SELECT * FROM table WHERE some_key > 3 ORDER BY some_key ASC  LIMIT X`
Previous: `SELECT * FROM table WHERE some_key < 3 ORDER BY some_key DESC LIMIT X`
  

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

Возможно ли выбрать текущую запись вместе с X следующими и предыдущими записями в одной инструкции SQL?

Ответ №1:

Вы могли бы попробовать использовать ОБЪЕДИНЕНИЕ:

 SELECT * FROM table WHERE some_key > 3 ORDER BY some_key ASC  LIMIT X
UNION
SELECT * FROM table WHERE some_key = 3
UNION
SELECT * FROM table WHERE some_key < 3 ORDER BY some_key DESC LIMIT X
  

Возможно, вам потребуется исправить порядок вне объединений, но вышеописанное даст вам окно вокруг some_key = 3 того, что вы ищете, и оно будет аккуратно устранять пробелы в some_key значениях.

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

1. Спасибо, это навело меня на правильный путь — к сожалению, Android поддерживает только одно внешнее ORDER BY предложение при выполнении UNION .

Ответ №2:

В конце концов я использовал ответ от @mu, с некоторыми изменениями

В Android вы не можете использовать внутренние ORDER BY инструкции в UNION , только одну внешнюю ORDER BY для всего набора. Чтобы обойти это, я использовал тот факт, что SQLite на Android поддерживает внутренние запросы, выполнил каждый фактический выбор во внутреннем запросе, а затем выбрал все строки из внутреннего запроса для объединения следующим образом:

 SELECT * FROM (SELECT * FROM table WHERE some_key > 3 ORDER BY some_key ASC LIMIT X)
UNION
SELECT * FROM table WHERE some_key = 3
UNION
SELECT * FROM (SELECT * FROM table WHERE some_key < 3 ORDER BY some_key DESC LIMIT X)