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、空格处理

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

你可能感兴趣的:(query)