LINUX.ORG.RU

Переписать SQL-запрос

 , ,


0

2

Для одного запроса требуется иметь временную таблицу с числами из некоторого промежутка (чисел не больше нескольких десятков). Я могу это сделать через WITH:

WITH days AS (SELECT :startDay AS d UNION ALL SELECT d + 1 FROM days WHERE d + 1 < :stopDay) 
SELECT ... FROM days, ...

Вроде всё работает, но есть одна проблема - этот запрос находится внутри Android-приложения и использует встроенный SQLite. И на старых версиях Android конструкция WITH почему-то не работает. Нужно как-то переписать без использования конструкции WITH.

Если что, я могу сгенерировать последовательность чисел в коде приложения и передать в запрос уже её). Подставится в виде:

5, 6, 7, 8, 9, ...

Но надо как-то из этого сделать in-memory таблицу из одной колонки, существующую только 1 SELECT.

В тред приглашаются SQL-гуру.

UPD: Если сделать запрос типа:

select * from (VALUES (1), (2), (3)) AS t;

То мы получим временную таблицу с 3 строчками и одним полем. Но есть одна проблема - Android Room может делать (1, 2, 3), но не (1), (2), (3). То есть вместо строк получаются столбцы.

★★★★★

Последнее исправление: KivApple (всего исправлений: 3)

А просто (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 ...) в текст запроса воткнуть тоже никак?

monk ★★★★★
()

Если надо именно параметрами, тогда

SELECT ... FROM (select a.a + (10 * b.a) + (100 * c.a) as day from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c) as days where days.day BETWEEN :startDay AND :stopDay-1

В предположении, что startDay и stopDay в диапазоне 0..1000

monk ★★★★★
()
Ответ на: комментарий от KivApple

Сделай таблицу на 50 записей и выбирай из неё

select num + :startDay
from numbers
where num < :stopDay - :startDay
anonymous
()
Ответ на: комментарий от monk

Если не больше 50, тогда без таблицы c: select :startDay + a.a + (10 * b.a) as day

monk ★★★★★
()

на старых версиях Android конструкция WITH почему-то не работает

Научитесь уже наплевать на «старые версии», время затраченное на поддержку которых не окупается.

slovazap ★★★★★
()
Ответ на: комментарий от KivApple

Alias для подзапросов в SQLite не работает?

select ... from (select ...) as days ...
theNamelessOne ★★★★★
()

view в sqlite тоже нет?

anonymous
()

... Если что, я могу сгенерировать последовательность ... в коде приложения и передать в запрос уже её.

Вот запрос, работающий на версии 2.8:

select days.d, days2.d from 
(select (n + 100) as d from (select 1 as n union all select 2 as n union select 3 as n union select 4 as n)) as days, 
(select (n + 200) as d from (select 1 as n union all select 2 as n union select 3 as n union select 4 as n)) as days2
where days.d = (days2.d - 100);

101|201
102|202
103|203
104|204

Можно программно сгенерить по аналогичной схеме, если очень хочется извращаться )

Хотя более дельный совет дал выше anonymous.

vinvlad ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.