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.