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

使用SQL查询DB2 9中的XML数据

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

清单 14. 连接 XML 数据和非 XML 数据

 

select clients.name, clients.status from items, clients

where xmlexists('$c/Comments/Comment[CustomerID=$p]'

passing items.comments as "c", clients.id as "p")



第一行标识出要包括在查询结果集中的 SQL 列以及查询中所引用的源表。第二行包括了连接子句。这里,XMLExists 决定在一个目标源中的 "CustomerID" 值是否等于来自另一个目标源的值。第三行指定这两个源:第一个目标源是 "items" 表中的 XML 列 "comments",第二个目标源是 "clients" 表中的整数列 "id"。因此,如果客户对任何产品发表了评论,并且 "clients" 表中存在关于该客户的信息,那么 XMLExists 表达式将等于 "true",报告中将包括该客户的姓名和状态。

使用 SQL/XML 中的 "FLWOR" 表达式

虽然我们只讨论了几个函数,其实 SQL/XML 为查询 XML 数据和将 XML 数据与关系数据集成提供了很多强大的功能。实际上,您已经看到了这方面的一些例子,但是这里我们还要再讨论一些例子。

通过 XMLExists 和 XMLQuery 函数都可以将 XQuery 嵌入到 SQL 中。前面的例子展示了如何使用这些函数和简单的 XPath 表达式访问 XML 文档中感兴趣的某个部分。现在我们考虑一个简单的例子,这个例子将 XQuery 包括在 SQL 查询中。

XQueries 可以包含 "for"、"let"、"where" "、"order by" 和 "return" 子句中的一些或者全部。这些子句一起形成了 FLWOR (发音为 flower)表达式。SQL 程序员会发现,将 XQueries 嵌入到 SELECT 列表中以便将 XML 文档的片段提取(或投影)到结果集是很方便的。虽然 XMLQuery 函数的用法不止于此,不过本文只讨论这种情况。(将来的文章将更深入地讨论 XQuery。)

假设您要检索 "Gold" 客户的姓名和首要 email 地址。在某些方面,这个任务类似于我们前面在探索如何投影 XML 元素值的时候完成过的一个任务(参见 清单 9)。而在这里,我们将 XQuery (带有 "for" 和 "return" 子句)作为 XMLQuery 函数的输入:

清单 15. 使用 XQuery 的 "for" 和 "return" 检索 XML 数据

 

select name, xmlquery('for $e in $c/Client/email[1] return $e'

passing contactinfo as "c")

from clients

where status = 'Gold'



第一行指定结果集中将包括客户姓名和 XMLQuery 函数的输出。第二行表明将返回 "Client" 元素的第一个 "email" 子元素。第三行标识出 XML 数据的源 —— "contactinfo" 列。第四行说明这个列在 "clients" 表中,最后,第五行表明我们只对 "Gold" 客户感兴趣。

因为这个例子很简单,在这里您可以这样编写这个查询。不过,也可以用一种更紧凑的方式编写这个查询:

清单 16. 以更紧凑的方式重写查询

 

select name, xmlquery('$c/Client/email[1]'

passing contactinfo as "c")

from clients

where status = 'Gold'



不过,通过 XQuery 的 return 子句可以按照需要转换 XML 输出。例如,您可以提取 email 元素值并将它们发布为 HTML。下面的查询将产生一个结果集,其中每个 Gold 客户的第一个 email 地址以 HTML 段落的形式返回。

清单 17. 检索 XML 并将其转换成 HTML

 

select xmlquery('for $e in $c/Client/email[1]/text()

return <p>{$e}</p>'

passing contactinfo as "c")

from clients

where status = 'Gold'



第一行表明您只对符合条件的客户的第一个 email 地址的文本表示形式感兴趣。第二行指定该信息在返回之前需要用 HTML 段落标记括起来。具体来说,花括号({ })指示 DB2 计算被括起来的表达式(在这里是 "$e")的值,而不是将其视作一个文字字符串。如果省略了花括号,对于每个符合条件的客户记录,DB2 将返回一个包含 "<p>$e</p>" 的结果。

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