Listagg в подзапросе в предложении select возвращает null - PullRequest
0 голосов
/ 04 октября 2019

У меня есть определенный запрос, в котором результаты запроса содержат значения start_value, step, range. Я хочу создать список всех возможных значений, начиная с шага добавления start_value на каждом уровне, пока уровень не достигнет диапазона. например.

start_value = 8
step = 1
range = 5

Тогда я хочу (8,9,10,11,12) в качестве результата.

Для этого я использую следующий код, но часть listagg возвращает ноль. Обратите внимание, что запрос с псевдонимом main_query будет отличаться в реальном времени и будет иметь несколько строк. Только для демонстрационных целей я использую там двойное. Также часть listagg останется прежней.

    select val,step,rang ,
    (select  listagg(colval) within group(order by colval) from
    (select  val + level*step as colval from dual
    connect by level <= rang+1))
    from
    (select 1 as val , 2 as step , 3 rang from dual) main_query;

РЕДАКТИРОВАТЬ:

Большое спасибо людям, которые дали быстрый ответ. Проблема в том, что уже есть предложение with, которое используется самим main_query. Таким образом, согласно представленному решению это будет теперь

WITH main_query as (

with query_1 as 
(select ... from ..),
query_2 as 
(select ... from ...),
select val,step,range from 
(select .... from query_1 join query_2 ....)main_query) 
select <values to be created using listagg> from main_query ;

Я не уверен, сработает ли это. Пожалуйста, дайте мне знать, если считаете, что это будет.

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Используйте connect by с listagg следующим образом:

SQL> WITH MAIN_QUERY AS (
  2      SELECT
  3          8 AS VAL,
  4          1 AS STEP,
  5          5 RANG
  6      FROM
  7          DUAL
  8  )
  9  SELECT
 10      LISTAGG(VAL +((LEVEL - 1) * STEP), ',') WITHIN GROUP(
 11          ORDER BY
 12              LEVEL
 13      ) AS RESULT
 14  FROM
 15      MAIN_QUERY
 16  CONNECT BY
 17      LEVEL <= RANG;

RESULT
--------------------------------------------------------------------------------
8,9,10,11,12

SQL>

Для различных значений:

SQL> WITH MAIN_QUERY AS (
  2      SELECT
  3          1 AS VAL,
  4          2 AS STEP,
  5          3 RANG
  6      FROM
  7          DUAL
  8  )
  9  SELECT
 10      LISTAGG(VAL +((LEVEL - 1) * STEP), ',') WITHIN GROUP(
 11          ORDER BY
 12              LEVEL
 13      ) AS RESULT
 14  FROM
 15      MAIN_QUERY
 16  CONNECT BY
 17      LEVEL <= RANG;

RESULT
--------------------------------------------------------------------------------
1,3,5

SQL>

Приветствия !!

0 голосов
/ 04 октября 2019

Вы можете попробовать это:

использовать с выпиской.

   with main as
 (select 8 as start_value , 1 as step , 5 range from dual)
,sub as ( SELECT   LEVEL   AS colval
                      FROM main 
                CONNECT BY LEVEL  < start_value+range*step
  )
,sub2 as(
select * from
sub,main
where colval>=start_value
)
select listagg(colval,',') within group(order by colval)  from
sub2
...