динамический свод в db2

Итак, у нас есть ключевое слово PIVOT в Oracle/SQL Server, когда вы конвертируете строки в столбцы. Не в DB2, я хочу преобразовать результаты строк и объединить их в столбец динамически, например, я не знаю, сколько строк я могу получить, они могут различаться. Например, таблица х

COL1  COL2
ABC  10
ABC  20
ABC  30

Я хочу отобразить это как

COL1  COL2
ABC   10,20,30

Но количество записей может варьироваться, поэтому я не могу использовать case.

Хотите сделать это для запросов многих таблиц, а не для конкретного запроса; функции или, что наиболее предпочтительно, в самом запросе выбора.


person Shama Thakur    schedule 29.11.2018    source источник
comment
Какая именно марка DB2? ЛУВ? iSeries? Z/ОС? DB2 LUW поддерживает listagg(): stackoverflow.com/questions/7188542   -  person a_horse_with_no_name    schedule 29.11.2018
comment
Привет, да db2 LUW. Да, я использовал LISTAGG(), и он работает, однако после конкатенации после определенного предела он дает мне ошибку размера. Любое обходное решение для этого? использование CAST является опцией, например: LISTAGG(CAST(‹columname› AS VARGRAPHIC(10000)), ', ') но по-прежнему резервирует фиксированную длину.   -  person Shama Thakur    schedule 29.11.2018
comment
LISTAGG ограничен максимальной длиной VARCHAR, то есть 32000 байт или около того.   -  person Paul Vernon    schedule 29.11.2018
comment
Спасибо за ответ. Я вижу, может ли это быть динамическим, потому что я обязательно буду резервировать 32000, и что, если строка увеличится на 32000? Любая идея для обходного пути для этого?   -  person Shama Thakur    schedule 29.11.2018


Ответы (2)


Если вы используете выпуск Db2 LUW 11.1.4.4, вы можете найти обходной путь, используя sysibm.json_arrayфункция:

VALUES JSON_ARRAY(SELECT DEPTNO FROM DEPT);

1
-------------------------------
["F22","G22","H22","I22","J22"]

затем вы можете сохранить json_array в столбце на основе символов, varchar, clob.

person Kevin See - Db2 Hybrid Cloud    schedule 29.11.2018

Для более длинных строк.

select substr(xmlserialize(
xmlquery('$L/text()' passing XMLAGG(xmlelement(name "a", ','||colname)) as "L")
as clob(1m)
), 2)
from syscat.columns;
person Mark Barinstein    schedule 30.11.2018