Как преобразовать столбик xml в представление, используя sql в db2 - PullRequest
0 голосов
/ 08 января 2020

У меня есть столбец XML в базе данных DB2, в котором есть несколько вхождений элемента с суффиксом _indexNumber, например:

<form>
    <field name="surname" type="String">
        <value>Smith</value>
    </field>
    <field name="given_name" type="String">
        <value>John</value>
    </field>
    <field name="date" type="Date">
        <date format="yyyy-MM-dd">
            <value>2020-01-01</value>
        </date>
    </field>
    <field index="1" name="transaction_id_1" setName="transactions" type="String">
        <value>1</value>
    </field>
    <field index="1" name="transaction_time_1" setName="transactions" type="String">
        <value>17:01:54</value>
    </field>
    <field index="1" name="transaction_city_1" setName="transactions" type="String">
        <value>Montreal</value>
    </field>
    <field index="2" name="transaction_id_2" setName="transactions" type="String">
        <value>2</value>
    </field>
    <field index="2" name="transaction_time_2" setName="transactions" type="String">
         <value>17:35:21</value>
    </field>
    <field index="2" name="transaction_city_2" setName="transactions" type="String">
        <value>Montreal</value>
    </field>
</form>

Я хочу создать представление, используя SQL с этим выводом :

--------------------------------------------------------------------------------------------
| surname | given_name | date       | transaction_id | transaction_time | transaction_city |
--------------------------------------------------------------------------------------------
| Smith   | John       | 2020-01-01 | 1              | 17:01:54         | Montreal         |
--------------------------------------------------------------------------------------------
| Smith   | John       | 2020-01-01 | 2              | 17:35:21         | Montreal         |
--------------------------------------------------------------------------------------------

До сих пор я использовал функцию XMLTABLE и легко мог работать с 1 транзакцией:

CREATE OR REPLACE VIEW VIEW_XML AS
SELECT X.*
FROM TEST_XML,
     XMLTABLE('$i/form' passing col_xml AS "i"
     COLUMNS
     surname varchar(255)  PATH 'field[@name=''surname'']/value',
     given_name varchar(255)  PATH 'field[@name=''given_name'']/date/value',
     date varchar(255)  PATH 'field[@name=''date'']/value',
     transaction_id varchar(255)  PATH 'field[@name=''transaction_id_1'']/value',
     transaction_time varchar(255)  PATH 'field[@name=''transaction_time_1'']/value',
     transaction_city varchar(255)  PATH 'field[@name=''transaction_city_1'']/value'
    ) AS X

И это дает следующий результат:

--------------------------------------------------------------------------------------------
| surname | given_name | date       | transaction_id | transaction_time | transaction_city |
--------------------------------------------------------------------------------------------
| Smith   | John       | 2020-01-01 | 1              | 17:01:54         | Montreal         |
--------------------------------------------------------------------------------------------

Как я могу получить вторую транзакцию в новом ряду?

1 Ответ

1 голос
/ 08 января 2020

Попробуйте это:

SELECT X.*
FROM 
  TEST_XML T
, XMLTABLE('$i/form/field[fn:starts-with(@name, "transaction_id")]' passing T.col_xml AS "i"
     COLUMNS
       surname          varchar(255) PATH '../field[@name="surname"]/value',
       given_name       varchar(255) PATH '../field[@name="given_name"]/value',
       date             varchar(255) PATH '../field[@name="date"]/date/value',
       transaction_id   varchar(255) PATH './value',
       transaction_time varchar(255) PATH 'let $i := ./value return ../field[@index=$i and fn:starts-with(@name, "transaction_time")]/value',
       transaction_city varchar(255) PATH 'let $i := ./value return ../field[@index=$i and fn:starts-with(@name, "transaction_city")]/value'
) X;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...