您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 房地产 > 730_07_XQuery
®InformationManagement©2006IBMCorporationXQuery简介InformationManagement2XQuery概述XQuery语言来源于XPath(定义用户如何在XML文档中导航)和XMLSchema(让用户能够为文档指定有效的结构和数据类型)等其他XML标准。路径表达式允许用户在XML文档的层次结构中导航(或者说“漫游”)并返回在路径末端找到的节点。FLWOR表达式它很像SQL中的SELECT-FROM-WHERE表达式。它用来遍历一系列条目并可选地返回每个条目的某些计算结果。InformationManagement3XQuery与SQL的差异XML文档包含层次结构并有固有的次序,关系DBMS(或者更准确地说,基于SQL的DBMS)支持的表是平面的和基于集合的,所以行是无序的。数据模型中的这些差异使得用来支持它们的查询语言有很大差异XQuery使程序员能够在XML的层次结构中导航。一般的SQL(不带XML扩展)没有(也不需要)在表数据结构中“导航”的表达式。XQuery支持有类型数据和无类型数据,而SQL数据总是要用特定的类型进行定义。XQuery没有空值(null),因为XML文档忽略缺失的或未知的数据。SQL使用空值表示缺失的或未知的数据。XQuery返回XML数据的序列;SQL返回各种SQL数据类型的结果集。昀后,XQuery只操作XML数据。SQL操作按照传统SQL类型定义的列,SQL/XML(带XML扩展的SQL)操作XML数据和传统类型的SQL数据。InformationManagement4示例XML文档Clientid=123Addressstreet9999ElmSt./streetcitySanJose/citystateCA/statezip95141/zip/Addressemailanyemail@yahoo.com/emailemailanotheremail@yahoo.com/email/ClientInformationManagement5示例XML文档中的元素、属性和文本节点InformationManagement6XQuery中的路径表达式(XPATH大小写敏感)要想获得示例文档中的email元素,可以编写下面的表达式:/Client/email如果文档包含多个email元素,而您只想获得第一个,那么可以编写:/Client/email[1]可以使用@符号指定属性节点,从而在元素中识别出属性。下面这个路径表达式导航到id属性等于123的Client元素中的第一个email元素:/Client[@id='123']/email[1]XPath用户常常根据元素值进行过滤,比如下面的表达式返回住在加利福尼亚的客户的zip元素:/Client/Address[state=CA]/zip可以使用通配符(“*”)匹配路径表达式中各个步上的任何节点。下面的示例获取在Client元素的任何直接子元素下找到的任何city元素。/Client/*/city对于我们的示例文档,这将返回值为SanJose的city元素。导航到这个city元素的更精确的方法是:/Client/Address/cityInformationManagement7更多路径表达式及其含义//*获取文档中的所有节点,如果有多层节点,则先从昀上层显示,并显示所有下属的直接或间接的节点,然后,对每个分节点显示,也显示下属直接或间接的节点,类推//email寻找文档中任何地方的email元素/Client/email[1]/text()获得Client元素下第一个email元素的文本节点/Client/Address/*选择根Client元素的Address子元素的所有子节点/Client/data(@id)返回Client元素的id属性的值/Client/Address[state=CA]/../email寻找client下的email元素,..表示回到Address节点的父元素。InformationManagement8XQuery中的FLWOR表达式FLWOR表达式的子句以下面的关键字开头:for:遍历一个输入序列,依次将一个变量绑定到每个输入条目let:声明一个变量并给它赋值,值可以是包含多个条目的列表where:指定对查询结果进行过滤的标准orderby:指定结果的排序次序return:定义返回的结果InformationManagement9for和returnfor和return关键字用来遍历一系列值并为每个值返回某些结果。下面是一个非常简单的示例:for$iin(1,2,3)return$i在XQuery中,变量名前面有一个美元符号(“$”)。所以,前面的示例将数字1、2和3绑定到变量$i(每次绑定一个数字),并对于每次绑定返回$i的值。前面表达式的输出是3个值的序列:123InformationManagement10letlet是将一个单一输入值赋值给变量,但是这个输入值可以是零个、一个或更多条目的序列比如使用for关键字的表达式,并注意返回的输出:for$iin(1,2,3)returnoutput{$i}/outputoutput1/outputoutput2/outputoutput3/output而使用let关键字的类似表达式:let$i:=(1,2,3)returnoutput{$i}/outputoutput123/outputfor关键字遍历输入序列中的条目(每次一个),并将每个条目依次绑定到一个指定的变量。与之相反,let关键字将输入序列中的所有条目同时绑定到一个指定的变量。InformationManagement11where在XQuery中,where的功能很像SQL中的WHERE子句:它使用户能够将过滤标准应用于查询。比如for$iin(1,2,3)where$i3returnoutput{$i}/outputoutput1/outputoutput2/outputInformationManagement12orderby可以使用orderby关键字对结果进行排序比如for$iin(5,1,2,3)orderby$idescendingreturn$i5321InformationManagement13DB2对XQuery的支持可以直接使用XQuery语句,开头处加上xquery关键字支持将XQuery嵌入或包装到SQL语句中不需要在前面加上xquery关键字支持在XQuery中嵌套SQL语句InformationManagement14创建clients示例表createtableclients(idintprimarykeynotnull,namevarchar(50),statusvarchar(10),contactinfoxml);注:设置DB2命令行处理选项,以使XQuery更容易显示:db2-i-dInformationManagement15检索XML数据db2-fn:xmlcolumn函数返回给定的列中存储的XML文档序列。例如,以下查询返回包含客户联系信息的XML所有信息:xquerydb2-fn:xmlcolumn(‘CLIENTS.CONTACTINFO’)检索复杂XML类型的XQueryxqueryfor$yindb2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Addressreturn$y(或)xquerydb2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/AddressInformationManagement16检索复杂XML类型的XQuery的输出结果Addressstreet5401JulioAve./streetcitySanJose/citystateCA/statezip95116/zip/AddressAddressstreet1204MeridianAve./streetapt4A/aptcitySanJose/citystateCA/statezip95124/zip/AddressAddressstreet9407LosGatosBlvd./streetcityLosGatos/citystateCA/statezip95032/zip/Address......InformationManagement17使用WHERE子句返回邮政编码为95116的所有客户的邮政地址Xqueryfor$yindb2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Addresswhere$y/zip=95116“return$y因为只有一个客户的邮政编码为95116,返回的结果是:Addressstreet5401JulioAve./streetcitySanJose/citystateCA/statezip95116/zip/Address如果使用路径表达式:xquerydb2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Address[zip=95116]InformationManagement18使用FLOWER表达式对多个值进行过滤Xqueryfor$yindb2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Clientwhere$y/Address/zip=95032or$y/Address/city=SanJosereturn$y/email返回?xmlversion=1.0encoding=GBK?emaillove2shop@yahoo.com/email?xmlversion=1.0encoding=GBK?emailbeatlesfan36@hotmail.com/email?xmlversion=1.0encoding=GBK?emaillennonfan36@hotmail.com/email对应的路径表达式是xquerydb2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client[Address/zip=95032orAddress/city=SanJose]/emailInformationManagement19返回客户的第一个email元素xqueryfor$yindb2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Clientwhere$y/Address/zip=95032or$y/Address/city=SanJose“return$y/email[1](或)Xquerydb2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client[Address/zip=95032orAddress/city=SanJose]/email[1]InformationManagement20将XML转换为HTMLxqueryul{for$yindb2-fn:xmlcolumn('CLIENTS.CONTACTINFO')/Client/Addressorderby$y/zipreturnli{$y}/li}/ul其中:ul是HTML标记花括号让DB2计算并处理其中包含的表达式,而不是将它作为字符串对待。InformationManagemen
本文标题:730_07_XQuery
链接地址:https://www.777doc.com/doc-5533832 .html