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

Другие вопросы по тегам