新客网WWW.XKER.COM:致力做中国最专业的网络学院!
学院: 操作系统 - 网络应用 - 服务器 - 网络安全 - 工具软件 - 办公软件 - Web开发 - 数据库 - 网页设计 - 图形图像 - 媒体动画 - 硬件学堂 - 存储频道 - QQ专区
您的位置:首页 > 软件开发 > 数据库 > DB2教程 > 正文:使用XQuery查询DB2 XML数据

使用XQuery查询DB2 XML数据

新客网 XKER.COM 2006-08-28 来源: 收藏本文


如果您无兴趣通过查询获得 XML 片段,而只想要符合条件的 XML 元素值的文本表示,那么可以在 return 子句中调用 text() 函数,如 清单 6 所示:

清单 6. 两个用于检索客户传真数据的文本表示的查询



xquery

for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax

return $y/text()

(or)

xquery

db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/fax/text()

上述查询的输出如 清单 7 所示:

清单 7. 上述查询的示例输出



4081112222

5559998888



这些示例查询的结果都相当简单,因为 fax 元素是基于基本数据类型的。当然,元素也可能基于复杂的数据类型 —— 即包含子元素(或嵌套层次结构)。例如客户联系方式信息中的 Address 元素就是这样。根据 “DB2 Viper 快速入门”(developerWorks,2006 年 4 月)中定义的模式,该元素包含街道地址、门牌号、所在城市、州、国家以及邮政编码。考虑清单 8 中的 XQuery 将返回什么结果:

清单 8. 检索复杂 XML 类型的 FLWOR 表达式



xquery

for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address

return $y

如果您猜到返回的结果是包含 Address 元素及其所有子元素的一系列的 XML 片段,那就对了。清单 9 给出了一个例子:

清单 9. 上述查询的示例输出



<Address>

<street>5401 Julio Ave.</street>

<city>San Jose</city>

<state>CA</state>

<zip>95116</zip>

</Address>

. . .

<Address>

<street>1204 Meridian Ave.</street>

<apt>4A</apt>

<city>San Jose</city>

<state>CA</state>

<zip>95124</zip>

</Address>

注意: 为了易于阅读,这里的示例输出作了格式上的调整。DB2 Command Editor 是在一行中显示每个客户地址记录的。

过滤 XML 元素值

您可以修改上述 XQuery 例子,缩小选择范围。例如,我们来看看如何返回居住在邮政编码为 95116 的地区的所有客户的邮递地址。

与您想像的一样,通过 XQuery where 子句可以根据 XML 文档中 zip 元素的值来过滤结果。清单 10 说明了如何在 清单 8 中的 FLWOR 表达式中添加一个 where 子句,以获得您感兴趣的地址信息:

清单 10. 带有 “where” 子句的 FLWOR 表达式



xquery

for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address

where $y/zip="95116"

return $y

这里添加的 where 子句很容易理解。for 子句依次将变量 $y 绑定到每个地址。where 子句包含一个小型的路径表达式,该表达式从每个地址向下定位到其内嵌的 zip 元素。只有当这个 zip 元素等于 95116 时,where 子句才为 true(相应的地址被保留)。

通过在路径表达式中添加一个谓词也可以得到相同的结果,如 清单 11 所示:

清单 11. 带附加过滤谓词的路径表达式



xquery

db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address[zip="95116"]

当然,您可以根据邮政编码的值进行过滤,返回与街道地址无关的元素。而且,还可以在单个查询中根据多个 XML 元素值进行过滤。下面的查询返回居住在纽约市具有特定邮政编码(10011)的地区或圣何塞(San Jose)任何地方的客户的电子邮件信息。

清单 12. 在 FLWOR 表达式中根据多个 XML 元素值过滤



xquery

for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client

where $y/Address/zip="10011" or $y/Address/city="San Jose"

return $y/email

注意,我们更改了 for 子句,从而将变量 $y 绑定到 Client 元素,而不是绑定到 Address 元素。这样一来便可以根据 Client 元素的一部分子树(Address)过滤该元素,而返回另一部分子树(email)。where 子句和 return 子句中的路径表达式必须相对被绑定到变量(这里是 $y)的元素来编写。

收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭
发表评论
要记得去论坛讨论,点击注册新会员匿名评论
评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
阅读排行
随机推荐
实用信息推荐