Ако сте на 11.2, а не само на 11.1, можете да използвате LISTAGG
агрегатна функция
SELECT listagg( interval, ',' )
WITHIN GROUP( ORDER BY interval )
FROM (SELECT DISTINCT range AS interval
FROM table_name
WHERE age = 62)
Ако използвате по-ранна версия на Oracle, можете да използвате някой от другите Техники за агрегиране на низове на Oracle на страницата на Тим Хол. Преди 11.2 моето лично предпочитание би било да създам дефиниран от потребителя агрегатна функция за да можете след това
SELECT string_agg( interval )
FROM (SELECT DISTINCT range AS interval
FROM table_name
WHERE age = 62)
Ако обаче не искате да създадете функция, можете да използвате ROW_NUMBER и SYS_CONNECT_BY_PATH подход въпреки че това обикновено става малко по-трудно за следване
with x as (
SELECT DISTINCT range AS interval
FROM table_name
WHERE age = 62 )
select ltrim( max( sys_connect_by_path(interval, ','))
keep (dense_rank last order by curr),
',') range
from (select interval,
row_number() over (order by interval) as curr,
row_number() over (order by interval) -1 as prev
from x)
connect by prev = PRIOR curr
start with curr = 1