DB2 9 基础(730 测验)认证指南,第 7 局部: XQuery 简介(5)

developerWorks








按照 XML 元素值进行过滤的查询

用户常常希望在 XQuery 中指定基于 XML 的过滤条件。这也很轻易。在本节中,您将看到怎样让前面的 XQuery 示例更有选择性。

指定单一过滤谓词

我们先钻研一下怎样前往邮政编码为 95116 的全部客户的邮政地址。可以将 where 子句结合进 XQuery,从而按照 DB2 中存储的示例 XML 文档中的 zip 元素值对成就进行过滤。将一个 where 子句添加到 清单 19 中的 FLWOR 表达式中,从而只失掉感爱好的地址,如下所示:

清单 21. 带 “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 子句才为真(是以失掉这个地址)。

由于只需一个客户的邮政编码为 95116,前往的成就是:

清单 22. 前一个查询的输入

                    
<Address>
  <street>5401 Julio Ave.</street>
  <city>San Jose</city>
  <state>CA</state>
  <zip>95116</zip>
</Address>


可以经过议定在途径表达式中添加谓词来失掉极度的成就,如下所示:

清单 23. 带过滤谓词的途径表达式

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


指定多个过滤谓词

固然,经过议定按照邮政编码值进行过滤,也可以前往与街道地址有关的元素。还可以在一个查询中按照多个 XML 元素值进行过滤。上面的查询前往那些住在 San Jose 市可能邮政编码为 95032(这是加利福尼亚 Los Gatos 的邮政编码)的客户的电子邮件信息。

清单 24. 用 FLWOR 表达式按照多个 XML 元素值进行过滤

                    
xquery 
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client
where $y/Address/zip="95032" or $y/Address/city="San Jose"
return $y/email


这个示例删改了 for 子句,从而将变量 $y 绑定到 Client 元素而不是 Address 元素。这样就可以按照子树的一局部(Address)对 Client 元素进行过滤,但是前往子树的另一局部(email)。where 子句和 return 子句中的途径表达式必需绝凑合绑定到变量(在这个示例中是 $y)的元素。

极度的查询可以更正确地体现为途径表达式:

清单 25. 用途径表达式按照多个 XML 元素值进行过滤

                    
xquery 
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client[Address/zip="95032"  
or Address/city="San Jose"]/email;


凑合 clients 表中的示例数据,前面两个查询的输入是:

清单 26. 查询输入

                    
<email>
	love2shop@yahoo.com
</email>
<email>
	beatlesfan36@hotmail.com
</email>
<email>
	lennonfan36@hotmail.com
</email>


XQuery 和 SQL 之间差异的实际示例

要是考查 清单 26 中的查询输入,您可能会发现前往的成就在两个方面与 SQL 法式员的预期有显著差异:

  • 凑合没有提供电子邮件地址的客户,没有前往 XML 数据。

    在我们的 示例数据 中,有四个客户自满查询的选择条件(住在 San Jose 可能邮政编码为 95032),但是这一实际没有反应反映在查询成就中。为什么呢?由于此中两个客户的记录中没有 email 元素。由于 XQuery 不运用空值,这些 “缺失的” 信息不会反应反映在成就中。

  • 输入没有表达哪些电子邮件地址来自同一个 XML 文档。

    过细看 示例数据,就会发现 清单 26 所示的最后两个电子邮件地址搜罗在同一个 XML 文档中(也即是说,它们属于同一个客户)。这一点在输入中看不出来。


在某些情形下,这两种显现可能恰是我们需求的,但在其他情形下可能不睬想。譬喻,要是希望向记录的每个帐号发送一封电子邮件,那么会遍历 XML 花式的客户电子邮件地址列表,这在运用法式中很轻易办到。但是,要是希望向每个客户只发送一次关照,搜罗那些只提供了街道地址的客户,那么前面的 XQuery 就不足了。

可以以多种措施改写前面的查询,让前往的成就以某种措施表达有缺失的信息,并表达多个电子邮件地址来自同一个客户记录(即,同一个 XML 文档)。在本教程前面,您将学到怎样编写这样的查询。但是,要是只是希望前往的列表中凑合每个客户只搜罗一个电子邮件地址,那么只需稍稍删改前面的查询:

清单 27. 前往客户的第一个 email 元素

                    
xquery 
for $y in db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client
where $y/Address/zip="95032" or $y/Address/city="San Jose"
return $y/email[1]
(或)
xquery 
db2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client[Address/zip="95032"  
or Address/city="San Jose"]/email[1];


这两个查询都指示 DB2 前往在吻合条件的 XML 文档(客户联系记录)中找到的第一个 email 元素。要是凑合某个吻合条件的客户没有找到电子邮件地址,那么它不前往这个客户的任何信息。是以,这两个查询产生上面的输入:

清单 28. 查询输入

                    
<email>
	love2shop@yahoo.com
</email>
<email>
	beatlesfan36@hotmail.com
</email>





版权声明: 原创作品,答应转载,转载时请务必以超链接情势标明文章 原始情由 、作者信息和本声明。不然将追究执法责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1972936.html