Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
Я вам не Димон.
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 70
Подскажите пожалуйста, как следует составить запрос (в Oracle sql не силён)

Дана таблица T_RANGE и два целочисленных столбца A и B
Каждая строка такой таблицы означает диапазон (или интервал) целых чисел.
Например, такие данные:
A | B
______
10 | 12
23 | 25
51 | 55

Нужно одним запросом "развернуть" каждый диапазон так, чтобы получился один столбец - все целые числа из указанных диапазонов.
Для данного примера результат был бы

10
11
12
23
24
25
51
52
53
54
55
18 июл 18, 12:48    [21580759]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
Elic
Member

Откуда:
Сообщений: 29979
ТОП №11
18 июл 18, 13:04    [21580848]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
AmKad
Member

Откуда:
Сообщений: 5222
12c
with s (a,b) as (
select 10, 12 from dual union all
select 23, 25 from dual union all
select 51, 55 from dual)
select *
from s,
lateral(select a+level-1 value from dual connect by level <= b-a+1) lt;

         A          B      VALUE
---------- ---------- ----------
        10         12         10
        10         12         11
        10         12         12
        23         25         23
        23         25         24
        23         25         25
        51         55         51
        51         55         52
        51         55         53
        51         55         54
        51         55         55

11 rows selected.
18 июл 18, 13:17    [21580943]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
Я вам не Димон.
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 70
AmKad, sorry, нужно без UNION
так как эти диапазоны - величины переменные, т.е. сегодня одни значения, завтра другие.
18 июл 18, 13:19    [21580948]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
merch
Member

Откуда:
Сообщений: 169
Я вам не Димон.,

а ты хорош! поставил этого выскочку на место.
18 июл 18, 13:24    [21580970]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Я вам не Димон.
AmKad, sorry, нужно без UNION

Это всего лишь пример данных, чтобы не городить таблицу.
18 июл 18, 13:25    [21580976]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
Я вам не Димон.
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 70
AmKad, я может вас не так понял, тут просто union вы написали чтобы имитировать данные моей таблицы.
Мне нужно для Oracle 11g
18 июл 18, 13:26    [21580984]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 652
Я вам не Димон.
AmKad, sorry, нужно без UNION
так как эти диапазоны - величины переменные, т.е. сегодня одни значения, завтра другие.


Ой порадовали к обеду

читайте как:

select *
from T_RANGE,
lateral(select a+level-1 value from dual connect by level <= b-a+1) lt;
18 июл 18, 13:26    [21580985]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
Elic
Member

Откуда:
Сообщений: 29979
AmKad
12c
select *
from s,
lateral(select a+level-1 value from dual connect by level <= b-a+1) lt;
11g:
select xmlcast(column_value as int)
from s, xmltable(a || ' to ' || b);
18 июл 18, 13:27    [21580996]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
Я вам не Димон.
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 70
MaximaXXL

читайте как:

select *
from T_RANGE,
lateral(select a+level-1 value from dual connect by level <= b-a+1) lt;


[Error] Execution (5: 8): ORA-00933: неверное завершение SQL-предложения
:-(
Oracle 11g
18 июл 18, 13:32    [21581027]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
AmKad
Member

Откуда:
Сообщений: 5222
merch
Я вам не Димон.,

а ты хорош! поставил этого выскочку на место.
Видимо сегодня не мой день. Простите
18 июл 18, 13:32    [21581030]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
Я вам не Димон.
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 70
Форумчане! Вопрос актуален, пока что ни один из предложенных вариантов не подошёл.
18 июл 18, 14:31    [21581349]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 652
Я вам не Димон.,

21580996 Это решение то чем Вам не подходит?
18 июл 18, 14:40    [21581409]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
Я вам не Димон.
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 70
Elic
AmKad
12c
select *
from s,
lateral(select a+level-1 value from dual connect by level <= b-a+1) lt;

11g:
select xmlcast(column_value as int)
from s, xmltable(a || ' to ' || b);

а нет, сорри ещё раз
вот это сработало!
select xmlcast(column_value as int)
from t_range, xmltable(a || ' to ' || b);
18 июл 18, 14:41    [21581414]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
Я вам не Димон.
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 70
Elic, спасибо!!!
18 июл 18, 14:41    [21581418]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
Я вам не Димон.
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 70
Ещё 1 вариант подсказал один добрый человек

select a + level - 1 num
  from (select rownum rn, a, b from t_range) 
  connect by a + level -1 <= b and prior rn = rn and prior sys_guid() is not null
18 июл 18, 14:55    [21581488]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
Я вам не Димон.
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 70
Мир не без добрых людей. Ещё один добрый самаритянин подсказал:

WITH cte ( a, b ) AS (
  SELECT A, B FROM t_range
UNION ALL
  SELECT A + 1, B FROM cte WHERE A < B
)
SELECT a FROM cte order by a
18 июл 18, 14:58    [21581493]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 652
Ох не часто соединяются такие посты от одного человека
Я вам не Димон.
AmKad, sorry, нужно без UNION
так как эти диапазоны - величины переменные, т.е. сегодня одни значения, завтра другие.

Я вам не Димон.
Elic, спасибо!!!
18 июл 18, 15:40    [21581717]     Ответить | Цитировать Сообщить модератору
 Re: Составить запрос. "Развернуть" несколько целочисленных диапазонов.  [new]
Я вам не Димон.
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 70
AmKad , MaximaXXL , tru55  - спасибо вам за помощь и участие!
Спасибо всем неравнодушным форумчанам! Вы мне очень помогли.
18 июл 18, 15:45    [21581724]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить