技术开发 频道

使用Pure XML技术查询DB2 Express-C数据库



    上面的SQL语句显示了DB2 Express-C如何对XML内部数据进行查询,但这并不是PureXML的全部功能。PureXML还可以使用XMLTABLE将XML数据映射成一个表,使用COLUMNS子句将XML的一些节点映射成列,这些映射后的表和普通的关表的命名用方法一样。如上面的SQL还可用下面的SQL实现:

SELECT t1.id, tt.field1 FROM table1 d, XMLTABLE('for $emp in $xd/table1[@id=”xxx”]/row eturn $emp' passing t1.xml_data as
“xd” COLUMNS field1 varchar(
50) path 'field1/text()' ) as tt WHERE id >='0010'
    上面的SQL将每个row节点映射成一个表,并将field1节点映射成field1字段,并通过这个field1将所有满足条件的数据取出来。 使用XMLEXISTS还可以比较XML字段数据和关系表中的字段的值,如下面的SQL查询table1的xml_data字段和table2的name字段是否存相等的值。并返回table1的id字段。SQL语句如下:

SELECT t1.id FROM table1 t1, table2 t2 WHERE XMLEXISTS('$xd//row[field1 = $n]' passing t1.xml_data as "xd", t2.name as "n");
    上面的SQL语句还可以另外一种写方法:

SELECT t1.id FROM table1 t1, table2 t2 WHERE t2.name = XMLCAST(XMLQUERY('$xd//row/field1 ' passing xd.xml_data as "xd") as varchar(50));
    对于上面的两种实现方法,第一种要好一些。因为XMLCAST函数只需要一个值,而在这里XMLCAST中的语句如果field1节点有多个值满足条件时,就会返回多个值,这时这条语句将会执行失败。

    在SQL中嵌入XQuery或XPath的最大优势就是可以利用SQL强大的分组功能,如下面的SQL语句所示:

SELECT tt.f1,count(tt.f2) FROM table1, XMLTABLE ('$xd/table1/row' passing xml_data as "xd" COLUMNS f1 VARCHAR(50) PATH ' field1', f2 INTEGER PATH ' field2 ') as tt GROUP BY tt.f2
    上面的SQL语句按table1表的xml_data字段的field2节点进行分组,然后统计每组中field2节点的数量。
    在SQL中嵌入XQuery并不适合所有的情况,如只比较两个xml类型字段的某个节点的值,使用单独的XQuery要比将XQuery嵌入到SQL中更高效。如面的SQL比较table1的xml_data和table3表的id属性值,并返回row节点的数据。

SELECT XMLQUERY('$xd/table1/row' passing t1 as "xd") FROM table1 t1, table3 t3 WHERE XMLEXISTS('$xd/table1[@id=$md/table3/id] ' passing t1.xml_data as "xd", t3.mydata as "md");
    在上面的查询的WHERE子句中,我们向XMLEXISTS中传递XQuery,并在XQuery中设置了连接条件,这看起来有些复杂。其实要完成这些工作,使用普通的XQuery会更简单和便捷。
0
相关文章