除了基本的 CRUD 操作之外,还可以利用 XQuery 语言的功能非常精确地控制如何执行查询以及如何返回数据。例如,尽管获得客户所在的城市的列表是有意义的,但是市场营销部门更希望知道哪些类别的产品最畅销。这可以使市场营销活动更有针对性,不必将市场营销活动的预算分散在所有产品上。度量产品是否畅销的一种方法是,检查最近的销售是否是在某一产品类别中发生的,或者在特定的时间段内这些类别的产品是否畅销。
为了进行数据挖掘,我们首先问一个问题:在 2007 年 4 月 15 日到 2007 年 4 月 30 日之间,客户购买了哪些类别的产品?
为了回答市场营销部门的这个问题,使用清单 16 所示的查询:
清单 16. 获得 4 月 15 日到 4 月 30 日之间的产品类别销售的 XQuery
| XQUERY declare default element namespace "http://www.ibm.com/developerworks"; <categories> { let $categories := fn:distinct-values( for $c in db2-fn:xmlcolumn( "XML_CONTENTS.DATA")/marketinfo/sales/customer where xs:date($c/last_purchase) > xs:date("2007-04-15") and xs:date($c/last_purchase) <= xs:date("2007-04-30") return $c/categories/category/@type) for $c in $categories return <category>{$c}</category> } </categories> |
“let” 语句本身由一个 FLWOR(for、let、where、order by 和 return) XQuery 表达式组成。您可能会注意到,FLWOR 表达式常常相当于 SQL 中的 SELECT-FROM-WHERE 块。然后,循环遍历每个客户:for $c in db2-fn:xmlcolumn("XML_CONTENTS.DATA") /marketinfo/sales/customer,条件是购买日期晚于 2007 年 4 月 15 日,并早于 2007 年 4 月 30 日。如果购买满足这个条件,市场营销部门就想知道这次购买的情况:where xs:date($c/last_purchase) > xs:date("2007-04-15") and xs:date($c/last_purchase) <= xs:date("2007-04-30")。
对于这些购买,我们返回存储为 XML 属性的类别类型:$c/categories/category/@type。与前一个示例一样,使用 fn:distinct-values() 函数避免重复出现同一类别中的购买。将这个类别列表绑定到变量 $categories。
现在,$categories 存储着一系列不重复的类别,但是因为我们希望返回 XML,所以将序列中的每个值封装在
清单 17. 4 月 15 日到 4 月 30 日之间发生购买的产品类别的数据示例
| <categories> <category>Home</category> <category>Electronics</category> <category>Apparel</category> <category>Gifts & Flowers</category> <category>Baby</category> </categories> |
在下面的图 3 中,文档列表视图(/app/views/documents/list.rhtml)布局还包含预构建的报告表单,可以用来执行 XQuery 和 XPath 搜索。
图 3. Team Room 文档存储库和预构建的市场营销报告