Как развернуть значения колонки таблицы в одно поле в PL/SQL?
Добрый день, подскажите пожалуйста, имеется таблица следующего рода:
ID ; LOGIN
1 ; IVANOV
2 ; IVANOV
3 ; IVANOV
4 ; PETROV
1 ; PETROV
8 ; TIHONOV
Нужно сделать так, чтобы при запросе к таблице, информация имела следующий вид
LOGIN ; IDS
IVANOV ; 1|2|3
PETROV ; 4|1
TIHONOV ; 8
Т.е. все ID у логин объединились и через разделитель | находились в одном поле.
Вроде как в PL/SQL может помочь LISTAGG, но в моём реальном случае ID гораздо длиннее, и для определенных логинов не умещается в 4096 байт.
with function f (p_login varchar2) return varchar2
is
l_retval varchar2(32000);
begin
for x in (select id from t where login = p_login)
loop
l_retval:= l_retval||'|'||x.id;
end loop;
return l_retval;
end;
select plogin, f(plogin) from (
select distinct login as plogin from t
)
/
Пример выше подойдет только с версии 12 с. Но суть не меняется, оформите в функцию по примеру f.
Как вы указали listagg не подойдет из-за большой длины списка значений. По сути логика за этим такая: нет смысла показывать пользователю гигантский список значений. Обычно я делал неполный вывод с <...> в конце, если все значения не уместились в список (listagg тут не подойдет, нужна хранимка). При этом в список можно провалиться и получить уже полный список с постраничным разбиением в виде таблицы.
Если речь про автоматическую обработку приложением, то агрегация на стороне сервера, наверно, не подойдет в качестве решения. Также можно посмотреть в сторону XMLAGG или может быть уже что-то для json есть.