• DB2 9 底子基本(730 测验)认证指南,第 7 局部: XQuery 简介(8)


    developerWorks








    “混合型” 盘考

    您曾经看到了若何编写 XQuery 来检索 XML 文档片段、建树 XML 输出的新方式以及根据在盘考自己指定的前提前往分歧的输出。这些都是盘考 DB2 中存储的 XML 数据的简双设施。

    您要晓得,关于 XQuery 要学习的内容远比本教程讨论的多得多。但是,有一个主题是我们不克不及忽略的:若何编写同时网罗 SQL 和 XQuery 表达式的盘考。若是需求让盘考同时根据 XML 和非 XML 列值中缀过滤,那么就需求驾驭这种技术。

    由于本教程紧张关注 XQuery 并将它用作顶级语言,以是我们先钻研若何将 SQL 嵌入 XQuery 中。但肯定要留意,也可以给与相反的做法 —— 将 XQuery 嵌入 SQL 中。在本教程末尾,您会看到这种做法的一个冗长示例。但是,关于 SQL/XML 以及若何将 XQuery 嵌入 SQL 中的更多信息,请拜见 参考材料。

    将 SQL 嵌入 XQuery 中

    要将 SQL 嵌入 XQuery 中,需求哄骗 db2-fn:sqlquery 函数替换 db2-fn:xmlcolumn 函数。db2-fn:sqlquery 函数实行一个 SQL 盘考并只前往选择的数据。通报给 db2-fn:sqlquery 的 SQL 盘考必需只前往 XML 数据;这使 XQuery 可以进一步处置赏罚 SQL 盘考的了局。

    我们用一个示例将曾经讨论的很多不雅点连系起来。假定盼愿取得住在 San Jose 的 Gold 客户的全部电子邮件地点。若是一个客户有多个电子邮件地点,那么盼愿这些地点在输出中是同一个记录的构成局部。最初,若是吻合前提的 Gold 客户没有提供电子邮件地点,那么盼愿检索他的邮政地点。编写这样的盘考的一种设施如下:

    清单 35. 将 SQL 嵌上钩罗前提逻辑的 XQuery 中

                        
    xquery 
    for $y in 
    db2-fn:sqlquery('select contactinfo from clients where status=''Gold'' ')/Client
    where $y/Address/city="San Jose"
    return (
         if ($y/email) then <emailList>{$y/email}</emailList>
         else $y/Address   
    )
    


    我们过细看看第三行,这里嵌入了一个 SQL 语句。这个 SELECT 语句网罗一个基于 status 列的盘考谓词,将这个 VARCHAR 列的值与字符串 Gold 中缀角力计算。在 SQL 中,这样的字符串要突围在单引号中。固然这个示例看起来仿佛哄骗了双引号,但实际上是在角力计算值前后哄骗了两个单引号(''Gold'')。“额定的” 单引号是本义字符。若是在基于字符串的盘考谓词外哄骗双引号替换单引号,就会出现语法错误。

    这个盘考的输出是:

    清单 36. 盘考输出

                        
    <emailList>
    	<email>
    		love2shop@yahoo.com
    	</email>
    <Address>
    	<street>
    		1204 Meridian Ave.
    	</street>
    	<apt>	4A
    	</apt>
    	<city>
    		San Jose
    	</city>
    	<state>
    		CA
    	</state>
    	<zip>
    		95124
    	</zip>
    </Address>
    


    将 XQuery 嵌入 SQL 中

    肯定要留意,也可以将 XQuery 嵌入 SQL 中。实际上,DB2 9 提供了对类型 SQL/XML 函数的撑持,这些函数屡次用来组织以 SQL 为最外层(即顶级)语言的混合型盘考。固然详细讨论 DB2 的 SQL/XML 撑持赶过了本教程的范围,但至少有两个函数值得留意:

    XMLExists
    批准导航到 XML 文档中的一个元素(或其他类型的节点)并对特定的前提中缀测试。在 SQL WHERE 子句中指按时,XMLExists 将前往的了局限定为那些网罗餍足指定前提(即指定的前提为 “true”)的 XML 文档的行。您可以猜到了,应该将 XQuery 表达式作为输出通报给 XMLExists 函数,从而导航到文档中感兴趣的节点。
    XMLQuery
    批准将 XML 放到 SQL/XML 盘考前往的 SQL 了局齐集。它平日用来从 XML 文档中检索一个或多个元素。异常,XMLQuery 函数也以 XQuery 表达式作为输出。


    思索以下盘考。这个盘考将 SQL 用作顶级语言并网罗对 XMLQueryXMLExists 函数的挪用:

    清单 37. 将 XQuery 途径表达式嵌入 SQL 来获取和限定 XML 数据

                        
    select name, status,
    xmlquery('$c/Client/phone/home' passing contactinfo as "c") 
    from clients 
    where xmlexists('$y/Client/Address[zip="95032"]' passing contactinfo as "y")
    


    这个盘考前往的了局集包罗客户姓名、形状和家庭德律风号码列。前两列网罗 SQL VARCHAR 数据,第三列网罗从吻合前提的 XML 文档中提取的一个 XML 元素。我们来过细看看这个盘考的第二行和第四行。

    第二行在 SELECT 子句中挪用 XMLQuery,这示意这个函数前往的了局应该作为 SQL 了局齐集的一列。我们指定一个 XQuery 途径表达式作为这个函数的输出,这个表达式让 DB2 导航到 Client 元素上面的 phone 元素的 home 子元素。这个途径表达式引用一个变量($c),这个变量引用 contactinfo 列。

    第四行在 SQL WHERE 子句中挪用 XMLExists,这示意 DB2 应该根据一个 XML 谓词对了局中缀限定。这个谓词是在途径表达式中指定的,它示意我们只对具有特定邮政编码的客户感兴趣。异常,作为这个 SQL/XML 函数的输出提供的途径表达式界说一个变量(在这个示例中是 $y),这个变量标识 DB2 将在那里探求 XML 文档(在 contactinfo 列中)。

    马虎 示例数据,这个盘考的输出是一个单行的了局集,其值如下:

    清单 38. 盘考输出

                        
    Lisa Hansen         Silver    <home>4083332222</home>
    


    关于 DB2 的 SQL/XML 撑持的更多信息,拜见 参考材料。




    版权声明: 原创作品,批准转载,转载时请务必以超链接方式标明文章 原始情由 、作者信息和本声明。否则将究查执法责任。

  • 相关阅读:
    [SHOI2015]零件组装机
    [AH2017/HNOI2017]影魔
    空指针RE第一次公开赛-笔记
    i春秋2020新春公益赛WP
    博客园Markdown编辑器修改代码配色、添加代码行号
    buuctf Writeup
    关于Tarjan的一些问题
    NOIP2013D1T3货车运输 (生成树+树链剖分)
    1051: [HAOI2006]受欢迎的牛 (tarjan强连通分量+缩点)
    CodeForces 438D The Child and Sequence (线段树 暴力)
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1972933.html
Copyright © 2020-2023  润新知