Это немного странно - объединение как внутри одной строки, так и между несколькими строками. Один метод состоит в том, чтобы отключить и затем агрегировать:
select id1, listagg(id2, ',') within group (order by id2)
from (select id1, id2 from t union all
select id1, id3 from t
) t
where id2 is not null
group by id1;
Если предположить, что только id2
может быть NULL
, вы также можете express это как:
select id1,
listagg(concat(id2, coalesce(concat(',', id3), '')), ',') within group (order by id2)
from t
group by id1;