zoukankan      html  css  js  c++  java
  • 转载---SQL Server XML基础学习之<5>--XQuery(query)

    本章写一些SQL Server XML的一些XQuery基础语法,主要讲的query查询语法

    T-SQL 支持用于查询 XML 数据类型的 XQuery 语言的子集。
    XQuery 基于现有的 XPath 查询语言,并支持更好的迭代、更好的排序结果以及构造必需的 XML 的功能。
    在前面我们已经学习了 XPath 的基本语法,本章将学习T-SQL 的 XQuery 语法
    ------------------------------------------------------------------------------------------------------------------   
    T-SQL XQuery包含如下函数
    query(XPath条件):  结果为 xml 类型; 返回由符合条件的节点组成的非类型化的 XML 实例
    value(XPath条件,数据类型):结果为指定的标量值类型; xpath条件结果必须唯一
    exist(XPath条件):结果为布尔值; 表示节点是否存在,如果执行查询的 XML 数据类型实例包含NULL则返回NULL
    nodes(XPath条件): 返回由符合条件的节点组成的一行一列的结果表
    */
    
    DECLARE @x XML 
    SET @x='
    <root>
      <rogue id="001">
        <hobo id="1">
          <name>彪</name>
          <name>阿彪</name>
          <type>流氓</type>
        </hobo>
      </rogue>
      <rogue id="002">
        <hobo id="2">
          <name>光辉</name>
          <name>二辉</name>
          <type>流氓</type>
        </hobo>
      </rogue>
      <rogue id="001">
        <hobo id="3">
          <name>小德</name>
          <name>小D</name>
          <type>臭流氓</type>
        </hobo>
      </rogue>
    </root>'
    --取root的所有子节点
    --SELECT @x.query('root'),@x.query('/root'),@x.query('.')
    --/*注释:
    --	这里实际上是取所有节点,root 必须是最高级节点名称,当换成任意子节点都是取不到值的
    --*/
    --取 hobo 的所有子节点,不管 hobo 在文档中的位置。
    SELECT @x.query('//hobo')
    ----扩展:取rogue下 所有  name
    SELECT @x.query('//rogue//name')
    --取属性为id 的所有节点
    SELECT @x.query('//hobo[@id]')
    /*注释:
    	XQuery不支持直接顶级 attribute 节点,必须附带上对节点的查找
    	属性必须要加[]
    */
    --选取属于 root 子元素的第一个 rogue 元素。
    SELECT @x.query('/root/rogue[1]')
    --选取属于 root 子元素的最后一个 rogue 元素。
    SELECT @x.query('/root/rogue[last()]')
    --选取属于 root 子元素的倒数第二个 rogue 元素。
    SELECT @x.query('/root/rogue[last()-1]')
    --选取最前面的两个属于 root 元素的子元素的 rogue 元素。
    SELECT @x.query('/root/rogue[position()<3]')
    --选取 root 元素的所有 hobo 元素,且其中的属性 id 的值须大于 1。
    SELECT @x.query('/root//hobo[@id>1]')
    ----扩展: root 元素的所有 hobo 元素,且其中的属性 id 的值须大于 1 并且子节点 name 的值为 光辉 的。
    SELECT @x.query('/root/rogue[./hobo[@id>1 and name="光辉"]]')
    --选取 root 子元素的所有 rogue 元素,且 属性id 的值须大于 为001 子元素hobo 属性 id 的值为 1的
    SELECT @x.query('/root/rogue[@id="001" and ./hobo[@id=1]]')
    --if then else 表达式  
    SELECT @x.query('
    if ( 1=2 ) then
      /root/rogue[@id="001"]
    else
      /root/rogue[@id="002"]
    ')
    
    --路径表达式步骤中的谓词 
    SELECT @x.query('/root/rogue[1]/hobo/name')--选择第一个 /root/rogue 节点下的所有 <Name> 元素。
    SELECT @x.query('/root/rogue/hobo[1]/name')--选择 /root/rogue/hobo 节点下的所有 <Name> 元素。
    SELECT @x.query('/root/rogue/hobo/name[1]')--选择 /root/rogue/hobo 节点下的所有第一个 <Name> 元素。
    SELECT @x.query('(/root/rogue/hobo/name)[1]')--选择 /root/rogue/hobo 节点下的第一个 <Name> 元素。
    --使用聚合函数
    SELECT @x.query('count(/root/rogue/hobo/name)'),@x.query('count(/root/rogue/hobo/name[1])')
     --FLWOR 迭代语法。FLWOR 是 for、let、where、order by 和 return 的缩写词。
    --1
    SELECT @x.query('
    <result>
     { for $i in /root/rogue/hobo/name[1]
        return string($i)
     }
    </result>')
    --2
    SELECT @x.query('
       for $Loc in /root/rogue/hobo,
           $FirstStep in $Loc/name[1]
       return 
           string($FirstStep)
    ')
    --3
    SELECT @x.query('
       for $i in /root/rogue/hobo
       order by $i/@id descending
       return string($i/name[1])
    ')
    --4
    SELECT @x.query('
       for $i in /root/rogue/hobo
       order by local-name($i) 
       return string($i/name[1])
    ')
    
    如果有来生,一个人去远行,看不同的风景,感受生命的活力。。。
  • 相关阅读:
    网线
    第19次实验
    矩阵乘法
    20次试验
    视频笔记
    1
    effective C++ 条款 34:区分接口继承和实现继承
    effective C++ 条款 35:考虑virtual函数以外的其他选择
    effective C++ 条款 29:为“异常安全”而努力是值得的
    effective C++ 条款 27:尽量少做转型动作
  • 原文地址:https://www.cnblogs.com/Frank99/p/5974448.html
Copyright © 2011-2022 走看看