db2 XML объединяет поля
Мне нужен XML для создания представления. Наличие таблицы с данными xml: tbl1 (данные xml)
Я хочу взглянуть на это так, чтобы данные были в реляционной форме. Структура XML выглядит следующим образом:
<persons>
<person>
<name>BLA1</name>
<parameters>
<param>
<key>KKK1</key>
<value>VVV1</value>
</param>
<param>
<key>KKK2</key>
<value>VVV2</value>
</param>
</parameters>
</person>
<person>
<name>BLA2</name>
<parameters>
<param>
<key>KKK21</key>
<value>VVV21</value>
</param>
<param>
<key>KKK22</key>
<value>VVV22</value>
</param>
<param>
<key>KKK23</key>
<value>VVV23</value>
</param>
</parameters>
</person>
</persons>
и требуемая модель в новой таблице будет: (ИМЯ, ПАРАМЕТРЫ), где ПАРАМЕТРЫ должны быть в форме ключ = значение; ключ = значение;
то есть строка образца будет иметь вид: "BLA1" KKK1=VVV1;KKK2=VVV2;'
3 ответа
select name, listagg(key||'='||value, ';') params
from
xmltable( '$doc/persons/person/parameters/param' passing
XMLPARSE(DOCUMENT '
<persons>
<person>
<name>BLA1</name>
<parameters>
<param>
<key>KKK1</key>
<value>VVV1</value>
</param>
<param>
<key>KKK2</key>
<value>VVV2</value>
</param>
</parameters>
</person>
<person>
<name>BLA2</name>
<parameters>
<param>
<key>KKK21</key>
<value>VVV21</value>
</param>
<param>
<key>KKK22</key>
<value>VVV22</value>
</param>
<param>
<key>KKK23</key>
<value>VVV23</value>
</param>
</parameters>
</person>
</persons>
') as "doc"
COLUMNS "NAME" VARCHAR(64) PATH '../../name'
, "KEY" VARCHAR(64) PATH './key'
, "VALUE" VARCHAR(64) PATH './value'
) as x
group by name;
Для записи, вот как вы бы использовали ответ Марка в представлении
create table tbl1 (datas xml) organize by row;
INSERT INTO tbl1 VALUES '<persons>
<person><name>BLA1</name><parameters>
<param><key>KKK1</key><value>VVV1</value></param>
<param><key>KKK2</key><value>VVV2</value></param></parameters></person>
<person><name>BLA2</name><parameters>
<param><key>KKK21</key><value>VVV21</value></param>
<param><key>KKK22</key><value>VVV22</value></param>
<param><key>KKK23</key><value>VVV23</value></param></parameters></person></persons>'
;
CREATE VIEW vw1 AS
select NAME
, listagg(key||'='||value, ';') params
from tbl1
, xmltable( '$doc/persons/person/parameters/param' passing datas as "doc"
COLUMNS "NAME" VARCHAR(64) PATH '../../name'
, "KEY" VARCHAR(64) PATH './key'
, "VALUE" VARCHAR(64) PATH './value'
)
group by NAME
Вероятно, есть способ сделать агрегирование списков в xquery, но я не эксперт в этом, и это насколько я могу получить
select *
from
xmltable( '$doc/persons/person' passing
XMLPARSE(DOCUMENT '<persons>
<person><name>BLA1</name><parameters>
<param><key>KKK1</key><value>VVV1</value></param>
<param><key>KKK2</key><value>VVV2</value></param></parameters></person>
<person><name>BLA2</name><parameters>
<param><key>KKK21</key><value>VVV21</value></param>
<param><key>KKK22</key><value>VVV22</value></param>
<param><key>KKK23</key><value>VVV23</value></param></parameters></person></persons>') as "doc"
COLUMNS "NAME" VARCHAR(64) PATH './name'
, "PARAMS" VARCHAR(64) PATH 'fn:string-join(./parameters/param/key,";")'
, "VALUES" VARCHAR(64) PATH 'fn:string-join(./parameters/param/value,";")'
) as x
возвращается
NAME PARAMS VALUES
---- ----------------- -----------------
BLA1 KKK1;KKK2 VVV1;VVV2
BLA2 KKK21;KKK22;KKK23 VVV21;VVV22;VVV23
Я не уверен, как объединить ПАРАМЕТРЫ и ЗНАЧЕНИЯ в один столбец в xquery