XQuery语法中的排序(Sorting)。演示用的数据来自第一节。
1.使用order by
语句:对数字排序默认是升序
for $item in doc("order.xml")//item
order by $item/@num
return $item
返回:
<item dept="果国际" num="1697" quantity="1" color="白色"></item>
<item dept="果国际" num="1697" quantity="1" color="蓝色"></item>
<item dept="美够" num="2561" quantity="2"></item>
<item dept="美够" num="4954" quantity="1"></item>
<item dept="南极人" num="6380" quantity="1" color="黑色"></item>
2.使用多个字段排序:优先返回出现在前面的排序条件
for $item in doc("/product/order.xml")//item
order by $item/@quantity,$item/@num
return $item
返回:先按quantity排序,在按num排序
<item dept="果国际" num="1697" quantity="1" color="白色"></item>
<item dept="果国际" num="1697" quantity="1" color="蓝色"></item>
<item dept="美够" num="4954" quantity="1"></item>
<item dept="南极人" num="6380" quantity="1" color="黑色"></item>
<item dept="美够" num="2561" quantity="2"></item>
3.对于有空值的字段排序:空值默认排序在最后
for $prod in doc("/product/prices.xml")//prod
order by $prod/discount/text()
return $prod
结果:
<prod num="100873">
<price currency="RMB">299</price>
<discount type="CLR">10.00</discount>
</prod>
<prod num="4954">
<price currency="RMB">99</price>
<discount type="CLR">3.99</discount>
</prod>
<prod num="6380">
<price currency="RMB">699</price>
</prod>
4.使用FLWOR做复杂逻辑处理
for $prod in doc("/product/catalog.xml")//product
order by $prod/number
return <item>{string($prod/name)}</item>
结果:
<item>连衣裙</item>
<item>牛仔裤</item>
<item>百褶裙</item>
<item>半身裙</item>
<item>毛呢外套</item>
5.做排序比较
let $prods := doc("/product/catalog.xml")//product
for $prod in $prods
where $prod << $prods[@dept = $prod/@dept][last()]
return $prod
结果:
<product dept="美够">
<number>4954</number>
<name language="cn">半身裙</name>
</product>
6.使用unorder
做无序处理:
unordered(
for $item in doc("/product/order.xml")//item,
$prod in doc("/product/catalog.xml")//product
where $item/@num = $prod/number
return <item number="{$item/@num}" name="{$prod/name}"/>
)
结果:
<item number="2561" name="百褶裙"></item>
<item number="1697" name="牛仔裤"></item>
<item number="1697" name="牛仔裤"></item>
<item number="6380" name="毛呢外套"></item>