@strelkovandreyv

Как развернуть значения колонки таблицы в одно поле в 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 байт.

Может быть есть другое решение?
  • Вопрос задан
  • 488 просмотров
Пригласить эксперта
Ответы на вопрос 2
Easy:
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.
Ответ написан
Комментировать
TheRonCronix
@TheRonCronix
Как вы указали listagg не подойдет из-за большой длины списка значений. По сути логика за этим такая: нет смысла показывать пользователю гигантский список значений. Обычно я делал неполный вывод с <...> в конце, если все значения не уместились в список (listagg тут не подойдет, нужна хранимка). При этом в список можно провалиться и получить уже полный список с постраничным разбиением в виде таблицы.
Если речь про автоматическую обработку приложением, то агрегация на стороне сервера, наверно, не подойдет в качестве решения. Также можно посмотреть в сторону XMLAGG или может быть уже что-то для json есть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы