Oracle SQL разделить строку на несколько записей на основе начала и конца

#sql #oracle

#sql #Oracle

Вопрос:

Я пытаюсь понять, возможно ли создать представление Oracle SQL (например, без функции / процедуры), которое разбивает следующее на разные строки на основе начала и конца

Например.

  ------ ----------- --------- 
| user | start_num | end_num |
 ------ ----------- --------- 
| Bob  |        87 |      98 |
| Sue  |        55 |      64 |
 ------ ----------- --------- 
  

Пример результата:

  ------ ----- 
| User | num |
 ------ ----- 
| Bob  |  87 |
| Bob  |  88 |
| Bob  |  89 |
| Bob  |  90 |
| Bob  |  91 |
| Bob  |  92 |
| Bob  |  93 |
| Bob  |  94 |
| Bob  |  95 |
| Bob  |  95 |
| Bob  |  96 |
| Bob  |  97 |
| Bob  |  98 |
| Sue  |  55 |
| Sue  |  56 |
| Sue  |  57 |
| Sue  |  58 |
| Sue  |  59 |
| Sue  |  60 |
| Sue  |  61 |
| Sue  |  62 |
| Sue  |  63 |
| Sue  |  64 |
 ------ ----- 
  

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

Пример SQL для создания исходных данных:

 with tab1 as
     (select 'Bob' "user",87 "start_num", 98 "end_num" from dual
     union
     select 'Sue' "user",55 "start_num", 64 "end_num" from dual)
select * from tab1
  

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

1. Какую версию Oracle вы используете? Так же, как информация, если> 12c есть просто способ использовать lateral для генерации того, что вы хотите.

Ответ №1:

Одним из методов является рекурсивный CTE:

 with tab1 as (
      select 'Bob' as usr, 87 as start_num, 98 as end_num from dual
      union all
      select 'Sue' as usr, 55 as start_num, 64 as end_num from dual
     ),
     cte (usr, num, end_num) as (
      select usr, start_num, end_num
      from tab1
      union all
      select user, num   1, end_num
      from cte
      where num < end_num
     )
select usr, num
from cte;
  

Вот скрипка db<> .