CS257
Chris Pollett
Sep 9, 2020
CREATE TABLE NODE( ID CHAR(6) NOT NULL PRIMARY KEY, PARENT_ID CHAR(6), TYPE VARCHAR(9), LABEL VARCHAR(20), VALUE CLOB, FOREIGN KEY (PARENT_ID) REFERENCES NODE (ID) CONSTRAINT CC1 CHECK(TYPE IN ("element", "attribute")) )
<?xml version="1.0" encoding="UTF-8"?> <winecellar> <wine winekey="1"> <name>Jacques Selosse Brut Initial</name> <year>2012</year> <type>Champagne</type> <price>150</price> </wine> <wine winekey="2"> <name>Meneghetti White</name> <year>2010</year> <type>white wine</type> <price>18</price> </wine> </winecellar>would be mapped to the table rows:
doc("winecellar.xml")/winecellar/wine[price > 20]/namewould map to the SQL:
SELECT N2.VALUE FROM NODE N1, NODE N2 WHERE N2.LABEL="name" AND N1.LABEL="price" AND CAST(N1.VALUE AS INT) > 20 AND N1.PARENT_ID=N2.PARENT_ID
SELECT ExtractValue('<a><b>X</b><b>Y</b><b>Z</b></a>','//b[2]');would return Y and
SELECT -> UpdateXML('<a><b>CAT</b><d></d></a>', '/a', '<e>FOX</e>') AS val1, -> UpdateXML('<a><b>CAT</b><d></d></a>', '/b', '<e>FOX</e>') AS val2, -> UpdateXML('<a><b>CAT</b><d></d></a>', '//b', '<e>FOX</e>') AS val3, -> UpdateXML('<a><b>CAT</b><d></d></a>', '/a/d', '<e>FOX</e>') AS val4 , -> UpdateXML('<a><d></d><b>CAT</b><d></d></a>', '/a/d', '<e>FOX</e>') AS val5 -> \G *************************** 1. row *************************** val1: <e>FOX</e> val2: <a><b>CAT</b><d></d></a> val3: <a><e>FOX</e><d></d></a> val4: <a><b>CAT</b><e>FOX</e></a> val5: <a><e>FOX</e><b>CAT</b><e>FOX</e></a>
CREATE TABLE PRODUCT( PRODNR CHAR(6) NOT NULL PRIMARY KEY, PRODNAME VARCHAR(60) NOT NULL, PRODTYPE VARCHAR(15), AVAILABLE_QUANTITY INTEGER, REVIEW XML);
INSERT INTO PRODUCT VALUES('000120', 'Conundrum', 'white', 12, XMLPARSE(CONTENT '<review><author>Bart Baesens</author> <date>27/02/2017</date> <description>This is an excellent white wine with intriguing aromas of green apple, tangerine and honeysuckle blossoms. </description><rating max-value="100">94</rating> </review>'));
SELECT xmlelement(name foo, xmlattributes(current_date as bar), 'content'); outputs <foo bar="2020-09-09">content</foo>
SELECT xmlforest('abc' AS foo, 123 AS bar); xmlforest ------------------------------ <foo>abc</foo><bar>123</bar>
CREATE TABLE test (y int, x xml); INSERT INTO test VALUES (1, '<foo>abc</foo>'); INSERT INTO test VALUES (2, '<bar/>'); SELECT xmlagg(x) FROM test; xmlagg ---------------------- <foo>abc</foo><bar/>This can also work with an ORDER BY clause:
SELECT xmlagg(x ORDER BY y DESC) FROM test; xmlagg ---------------------- <bar/><foo>abc</foo>
SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF '<towns><town>Toronto</town><town>Ottawa</town></towns>');would return t (for true).
SELECT xpath('//author', REVIEW) FROM PRODUCT;