Применить порядок в строке через запятую в оракуле - PullRequest
0 голосов
/ 09 октября 2018

У меня есть один из столбцов в таблице оракулов, который имеет значение ниже:

select csv_val from my_table where date='09-OCT-18';

output
==================
50,100,25,5000,1000

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

 output
 ==================
 25,50,100,1000,5000

Я пробовал эту ссылку, но похоже, что она имеет некоторые ограничения на количество цифр.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

На основании размещенных вами примеров данных будет работать относительно простой запрос (вам нужны строки 3 - 7).Если данные на самом деле не выглядят так, запрос может нуждаться в корректировке.

SQL>  with my_table (csv_val) as
  2    (select '50,100,25,5000,1000' from dual)
  3  select listagg(token, ',') within group (order by to_number(token)) result
  4  from (select regexp_substr(csv_val, '[^,]+', 1, level) token
  5        from my_table
  6        connect by level <= regexp_count(csv_val, ',') + 1
  7       );

RESULT
-------------------------
25,50,100,1000,5000

SQL>
0 голосов
/ 09 октября 2018

Здесь я сделал вам модифицированную версию ответа, на которую вы ссылаетесь, который может обрабатывать произвольное (запрограммированное) количество запятых.Это довольно тяжело на CTE.Как и в большинстве ответов LISTAGG, у него будет ограничение в 4000 символов.Я также изменил ваше регулярное выражение, чтобы иметь возможность обрабатывать пустые записи в списке, на основе этого ответа .

WITH 
  T (N) AS --TEST DATA
    (SELECT '50,100,25,5000,1000' FROM DUAL
    UNION
    SELECT '25464,89453,15686' FROM DUAL
    UNION
    SELECT '21561,68547,51612' FROM DUAL
    ),
  nums (x) as -- arbitrary limit of 20, can be changed
    (select level from dual connect by level <= 20),
  splitstr (N, x, substring) as
    (select N, x, regexp_substr(N, '(.*?)(,|$)', 1, x, NULL, 1)
    from T
    inner join nums on x <= 1 + regexp_count(N, ',')
    order by N, x)
select N, listagg(substring, ',') within group (order by to_number(substring)) as sorted_N
from splitstr
group by N
; 

Возможно, его можно улучшить, но эх ...

...