简体   繁体   中英

How to transform an xml colum to a view using sql in db2

I have an XML column in a DB2 database that has multiple occurrences of an element with the _indexNumber suffix such as:

<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>

I want to create a view using SQL with this output:

--------------------------------------------------------------------------------------------
| 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         |
--------------------------------------------------------------------------------------------

So far I've been using the XMLTABLE function and I can work easily with 1 transaction:

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

And it gives the following result:

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

How can I get the second transaction on a new row?

Try this:

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM