Создайте строку последовательных чисел в запросе oracle SQL

#sql #oracle

#sql #Oracle

Вопрос:

Используя oracle SQL, я хочу сгенерировать строковый список чисел, рассчитанных до значения количества.

 Select [Item], [Quantity], <Something here> as [Quantity List]
from table 
 

чтобы вернуть

 [Item],[Quantity], [Quantity List]
'Socks', 2 , '1 2'
'Shoes', 3 , '1 2 3'
'Coats', 6 , '1 2 3 4 5 6'
'Hats' , 3 , '1 2 3'   etc...
 

Я не пытаюсь создать справочную таблицу, необходимо оценить каждое количество и ввести соответствующую строку по мере ее выполнения
Заранее спасибо

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

1. oracle или microsoft sql?

2. @Jim . , , В вашем вопросе указан Oracle, но вы используете квадратные скобки, что сбивает с толку. Обычно они связаны с SQL Server (хотя Sybase и SQLite также поддерживают их).

3. извините, да, я специалист по tsql по профессии, в силу привычки это, безусловно, oracle

Ответ №1:

Я бы предложил сначала сгенерировать все числа, а затем присоединиться к ним. Вы можете сгенерировать список с помощью рекурсивного CTE:

 with cte(n, max_qty, list) as (
      select 1, max_qty, '1'  as list
      from (select max(quantity) as max_qty from t) x
      union all
      select n   1, max_qty, list || ' ' || (n   1) 
      from cte
      where n < max_qty
     )
select t.*, cte.list
from t join
     cte
     on t.quantity = cte.n;
 

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

Примечание: Если вы действительно используете SQL Server, вы можете использовать очень похожую логику в этой базе данных.

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

1. Спасибо, Гордон, это здорово

Ответ №2:

Вы можете использовать hiearchical query в подзапросе select clause следующим образом:

 select item, quantity,
       (select listagg(level, ' ') within group(order by level)
         from dual connect by level <= quantity) as quantity_list
  from t
 

Db<>Fiddle для того же.