db2 XML объединяет поля - PullRequest
       46

db2 XML объединяет поля

0 голосов
/ 03 октября 2018

Мне нужен XML для создания представления.Имея таблицу с данными xml: tbl1 (xml datas)

Я хочу посмотреть на нее, чтобы данные были в реляционной форме.Структура 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>

, и требуемая модель в новой таблице будет иметь вид: (NAME, PARAMS), где PARAMS должен быть в форме ключ = значение; ключ = значение;

т.е. строка образца будет иметь вид: 'BLA1' 'KKK1 = VVV1; KKK2 = VVV2;'

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Вероятно, есть способ сделать агрегацию списка в 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

0 голосов
/ 03 октября 2018

Для записи, вот как бы вы использовали ответ Марка в представлении

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
0 голосов
/ 03 октября 2018
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;
...