#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)