Структура XML DB2 зависит от имени поля

Моя таблица содержит следующие поля:

  • Pos_name означает имя поля
  • Pos_value: значение поля
  • Row_numb: номер строки Pos_name
  • Row_count: количество строк Pos_name

    Pos_name    Pos_value   Row_numb   Row_Count
    child_id    10           1          1
    child_id    11           2          1
    first_name  MATHEWS      1          2
    first_name  KAINE        2          2
    
  • Row_numb: это для rownumber из Pos_Name. Это означает, что у нас есть 2 дочерних идентификатора, поэтому у нас есть 1,2

  • Row_count: child_id — это имя одного поля, поэтому это кадрирование 1, а для first_name — второе поле, поэтому его кадрирование 2.

Ожидаемый результат:

  <row>
        <child_id>10</child_id>
        <first_name>MATHEWS</first_name>
    </row>
    <row>
        <child_id>11</child_id>        
        <first_name>KAINE</first_name>
    </row>

person Saravanan Svn    schedule 03.12.2019    source источник


Ответы (1)


Из вашего вопроса неясно, нужен ли вам один XML-документ или один документ на «строку», и нужен ли вам тип данных xml или его сериализованное строковое представление. Было бы хорошо указать выше в вопросе явно.
Пример ниже предназначен для сериализованной формы одного XML-документа на «строку».
Если вам нужен один документ - раскомментируйте закомментированные строки.
Если вам нужны значения типа данных xml, закомментируйте строки, относящиеся к функции XMLSERIALIZE.

WITH T(Ele_name, Ele_Value, Row_numb, Row_Count) AS 
(
VALUES
  ('child_id', '10', 1, 1)
, ('child_id', '11', 2, 1)
, ('first_name', 'MATHEWS', 1, 2)
, ('first_name', 'KAINE', 2, 2)
)
SELECT 
XMLSERIALIZE (
--XMLELEMENT(NAME "doc", XMLAGG (
XMLPARSE
( DOCUMENT 
  '<row>'

|| COALESCE (
  '<'||A.ELE_NAME||'>'
||A.ELE_VALUE
||'</'||A.ELE_NAME||'>'
, '')

|| COALESCE (
  '<'||B.ELE_NAME||'>'
||B.ELE_VALUE
||'</'||B.ELE_NAME||'>'
, '')

||'</row>'
) 
--)) 
AS VARCHAR(200))
doc
FROM T A
LEFT JOIN T B ON A.ROW_NUMB = B.ROW_NUMB AND A.ELE_NAME <> B.ELE_NAME
WHERE A.ROW_COUNT=1
;
person Mark Barinstein    schedule 03.12.2019