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