• XQuery基础知识


    /***************************************************

              作者:herowang(让你望见影子的墙)

             日期:2009.10.21

              注:    转载请保留此信息

       ****************************************************/

     declare @myxml xml

    set @myxml='<root>成绩表--这是个文本节点

                 <item id="1" year="2009" depart="计算机" class="1班">

                   <sname> 王一诺</sname>

                   <course1>sql server2005</course1>

                   <grade>82</grade>

                 </item>

                 <item id="2" year="2009" class="1班">

                   <sname>王海</sname>

                   <course1>sql server2005</course1>

                   <grade>75</grade></item>

                 <item id="3" year="2009" class="1班">

                   <sname>王若天</sname>

                   <course1>oracle</course1>

                   <grade>59</grade>

                 </item>

               </root>'

    一、基础:

    序列和Qname:在XQuery中,表达式的结果由xml节点与xsd原子类型的实例组成。进行构造的时候,序列必须是同类的,即序列中的单项可以是节点也可是是原子值,但不能将原子值与节点进行构造;QName即xml的限定名称,由命名空间名称与本地名称两部分组成。

    原子化:在进行查询时,类型推到工作完成后,需要提取项的类型化值,这个提取过程成为原子化。Data函数用于返回指定项的类型化值。在某些环境下,该过程是隐式进行的。

    XQuery支持的数据类型:1)类型化值和字符串值,使用data()来检索节点,将返回节点的类型化值,使用string()函数,则将返回节点的字符值。Data()与string()得到的都是一个序列,而不单个的值。

    Data()函数示例:

    select @myxml.query('data(/root/item/grade)')

    ------

    82 75 59

    所以如果要和一个数进行计算的话,必须要说明节点,如:

    select @myxml.query('data(/root/item/grade)[1]+3')

    ------

    85

    String函数示例

    select @myxml.query('string(/root[1])')

    -------

    成绩表--这是个文本节点

                  王一诺sql server200582王海sql server200575王若天oracle59

    select @myxml.query('string(/root[1]/item[1]/sname[1])')

    -------

    王一诺

         2) 数据类型转换:表达式 cast as atomictype?   “?”表示表达式可以返回0或1个项。

    select @x.query('"2" cast as xs:integer?')

    select @x.query('xs:integer("2")')

         Xquey中注释:注释字符串包含在(:与:)之间

    select @x.query('(:这里是注释:)<root>5</root>')

    ------

    <root>5</root>

    二、表达式

    1、运算符:

    比较运算符:可用于比较原子值和节点。比较节点时,如果第二个序列中存在某个值与第一个序列中的某个值比较结果为true,则整个结果为true,否则为false。

    select @s.query(‘(1,2,3)=(3,4)’)

    -----

    True

    值比较运算符:用于比较原子值。等于Eq,不等于ne,小于lt,大于gt,小于等于le,大于等于ge

    select @myxml.query('data(/root/item/grade)[1] gt 60')

    ------

    True

    节点比较运算符:is,如果两边的操作数代表的是同一节点,则返回true,否则为false。

    select @myxml.query('(/root/item)[1] is (/root/item[@id=1])[1]')

    ------

    True

    节点顺序比较运算符:>>与<<。<<表示左边操作数表示的位置是否在右边操作数表示的位置的前面,>>则是后面

    select @myxml.query('(/root/item)[1] << (/root/item[@id=2])[1]')

    ------

    True

    关系运算:and 与or,连接多个查询条件

    2、FLWOR

         F:for用来进行循环迭代。需要先定义一个或多个循环变量,以$开头

         W:where设置筛选条件

         O;order by 对返回的数据进行排序

         R:retrun 返回结果

    select @myxml.query

    ('for $item in(//item)                    –-定义循环变量

      where ($item/grade)>60                   --进行筛选

      order by ($item/sname[1])                --进行排序,descending为降序

      return string($item/sname[1])'            --返回值

     )

    ------

    王海  王一诺

    3、条件表达式

       If 条件  then  表达式1 else 表达式2

       注:else是必须的,如果else后不需要表达式,则使用( ).

    select @myxml.query('for $item in(//item)

                         order by ($item/sname[1]) descending

                         return

                         if ($item/grade>60)

                         then  string($item/sname[1])

                         else ()

                         ')

    ------

    王海  王一诺

    四、构造XML

    1、在构造过程中,除了构造元素之外,还要进行路径查询计算的时候,使用{},大括号充当了上下文切换的标记,即从xml构造切换到查询计算。

    select @myxml.query('<newroot>{data(/root/item/grade)[1]}</newroot>')

    ------

    <newroot>82</newroot>

    在结果中要包含{}的时候,则可以用两个{{

    select @myxml.query('<newroot>{{{data(/root/item/grade)[1]}}}</newroot>')

    ------

    <newroot>{82}</newroot>

    2、在构造属性时,不支持多个属性表达式或者或者混合表达式。例如要生成

    <newroot item=”id 5”/>

    select @myxml.query('<newroot item="{concat("id",data((/root/item/@id))[1])}"> </newroot>')

    ------

    <newroot item="id1" />

    3、空格处理

    命名空间中的空格字符:修正开头和结尾处的所有空格,将内部空格字符变为一个空格;属性内容中的换行符转换为空格,所有其他的空格字符保持不变;元素中的空格不变。

  • 相关阅读:
    Python爬取优质高清壁纸网站:彼岸
    xpath爬取喜马拉雅糗事播报音频地址
    Pyquery爬取豆瓣电影Top250
    pipenv虚拟环境
    pip报No module named 'pip'错怎么处理?
    SVN的使用
    测试报告
    软件测试分类
    测试模型
    软件开发过程模型
  • 原文地址:https://www.cnblogs.com/trieagle/p/1629779.html
Copyright © 2020-2023  润新知