科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道教你使用SQL查询DB2 9中的XML数据

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

虽然 DB2 的混合体系结构与之前的版本有很大的不同,但是要利用它的新 XML 功能并不难。如果您已经熟悉 SQL,那么很快就可以将这方面的技能转化到对存储在 DB2 中的本地 XML 数据的处理上。

作者:赛迪网 来源:赛迪网 2007年9月5日

关键字: 数据库 XML DB2 DB2 9 SQL

  • 评论
  • 分享微博
  • 分享邮件
 

连接 XML 数据和关系数据

现在,您可能想知道如何连接 XML 数据和非 XML 数据(例如基于传统 SQL 类型的关系数据)。DB2 使您可以仅用一条 SQL/XML 语句来做到这一点。有很多方法可用来制定那样的连接,这取决于数据库模式和工作负载需求,不过这里我们只谈论一个例子。您也许会感到惊讶,其实您已经知道足够多关于 SQL/XML 的东西,完全可以实现这种连接。

还记得吗,"items" 表中的 XML 列包含一个 "CustomerID" 元素。这可以作为与 "clients" 表中基于整数的列 "id" 的一个连接键。因此,如果要获得一个报告,其中列出对您的一件或多件产品发表了评论的客户的姓名和状态,那么需要将一个表中的 XML 元素值与来自另一个表中的 SQL 整数值相连接。实现这一点的一种方法是使用 XMLExists 函数,如 清单 14 所示:

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

select clients.name, clients.status from items, clientswhere 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 clientswhere status = 'Gold'

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

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

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

select name, xmlquery('$c/Client/email[1]' passing contactinfo as "c") from clientswhere 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 clientswhere status = 'Gold'

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

$e

" 的结果。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章