您可能很想知道如何在应用程序中包括限制 XML 数据的查询。虽然本文不详细讨论应用开发话题,但还是提供了一个 简单的 Java 例子,这个例子在一条 SQL/XML 语句中使用一个参数标记位将输出限制为居住在给定地区的客户的信息。
“投影” XML 元素值
现在让我们考虑一种稍微有些不同的情景,假设您想将 XML 值投影到返回的结果集。换句话说,我们要从 XML 文档中检索一个或多个元素值。有很多方法可以做这件事。首先我们使用 XMLQuery 函数来检索一个元素的值,然后使用 XMLTable 函数来检索多个元素的值,然后将这些映射到一个 SQL 结果集的列。
我们来考虑如何解决之前摆在我们面前的一个问题:如何创建一个列出 Gold 客户的 email 地址的报告。下面 清单 7 中的查询调用 XMLQuery 函数来完成这项任务:
清单 7. 检索符合条件的客户的 email 信息
|
第一行指定要返回根元素 "Client" 的 "email" 子元素的值。第二行和第三行表明 DB2 在哪里可以找到该信息 —— 在 "clients" 表的 "contactinfo" 列中。第四行进一步限制查询,表明您只对 Gold 客户的 email 地址感兴趣。这个查询将返回一组 XML 元素和值。例如,如果有 500 名 Gold 客户,每个客户有一个 email 地址,那么输出将是一个单列的结果集,一共有 500 行,如 清单 8 所示:
清单 8. 之前查询的示例输出
|
如果每个 Gold 客户有多个 email 地址,那么需要指示 DB2 只返回首要的地址(也就是在客户的 "contactinfo" 文档中找到的第一个 email 地址)。为此,可以修改查询的第一行中的表达式:
清单 9. 检索每个符合条件的客户的第一个 email 地址
|
最后,如果有些 Gold 客户没有 email 地址,那么可能要编写一个查询从结果集中排除 null 值。为此可以修改之前的查询,添加另一个谓词到 WHERE 中,以测试是否缺少 email 信息。您已经熟悉了一个可以帮您实现这一点的 SQL/XML 函数 —— 那就是 XMLExists。清单 10 展示了如何重新编写之前的查询,以便过滤掉那些联系方式(存储为 XML 文档)中缺少 email 地址的 Gold 客户的行:
清单 10. 对于至少有一个 email 地址的客户,检索每个符合条件的客户的第一个 email 地址
|
现在我们考虑一个稍微不同的情景,假设您要检索多个 XML 元素值。XMLTable 可以从 XML 列中的数据生成标量输出,可以为程序员提供 XML 数据的 “关系” 视图,因此非常有用。与 XMLExists 和 XMLQuery 一样,XMLTable 函数使 DB2 在 XML 文档层次结构中定位到感兴趣的数据。然而,XMLTable 还包括一些子句,用于将目标 XML 数据映射到 SQL 数据类型的结果集列。
考虑以下查询(清单 11),该查询投影存储在 "items" 表中的关系数据和 XML 数据。(关于 "items" 表请查看 图 1)。评论 ID、客户 ID 和评语存储在 "comments" 列中的 XML 文档中。商品名称存储在一个 SQL VARCHAR 列中。
清单 11. 检索多个 XML 元素并将每个元素转换成传统的 SQL 数据类型
|
最新相关文章
发表评论