XQuery的order by子句用于在FLWOR表达式中对查询结果进行排序,开发者可以通过该子句指定排序的字段、排序方向以及空值处理规则,从而得到符合预期顺序的返回结果。
order by子句基础语法
order by子句通常跟在FLWOR表达式的where子句之后,return子句之前,基础语法结构如下:
for $item in /bookstore/book where $item/price > 30 order by $item/price return $item
上述代码会先筛选出价格大于30的图书节点,再按照图书价格升序排列后返回结果。默认情况下order by子句采用升序排序,如果需要指定降序,可以添加descending关键字。
升序与降序设置
order by子句支持两种排序方向,通过ascending和descending关键字控制,其中ascending是默认值可以省略:
(: 按照价格降序排序,价格高的图书排在前面 :) for $book in /bookstore/book order by $book/price descending return $book (: 按照书名升序排序,默认ascending可以省略 :) for $book in /bookstore/book order by $book/title ascending return $book
多字段排序
当需要按照多个条件排序时,可以在order by子句中指定多个排序表达式,用逗号分隔,排序优先级从左到右依次降低:
(: 先按照分类升序排序,同一分类下再按照价格降序排序 :) for $book in /bookstore/book order by $book/category, $book/price descending return $book
空值处理规则
如果排序字段存在空值,XQuery默认会将空值排在结果的最前面,也可以通过empty greatest关键字将空值排在最后面:
(: 将空值的图书价格排在最后面 :) for $book in /bookstore/book order by $book/price empty greatest return $book
实际示例演示
假设存在如下结构的XML数据:
<bookstore>
<book>
<title>XML入门</title>
<category>技术</category>
<price>45</price>
</book>
<book>
<title>数据库原理</title>
<category>技术</category>
<price>52</price>
</book>
<book>
<title>散文精选</title>
<category>文学</category>
<price>38</price>
</book>
</bookstore>
执行以下XQuery查询:
for $book in /bookstore/book
order by $book/category, $book/price descending
return
<result>
<title>{$book/title/text()}</title>
<category>{$book/category/text()}</category>
<price>{$book/price/text()}</price>
</result>
返回结果会先列出所有技术类图书,技术类内部价格高的在前,接着是文学类图书,符合多字段排序的预期效果。
注意事项
- order by子句中使用的排序表达式必须是可比较的类型,比如数值、字符串、日期等,不同类型的数据混合排序可能会抛出异常。
- 字符串排序默认按照Unicode编码顺序进行,如果需要按照本地语言规则排序,可以结合collation参数设置排序规则。
- order by子句只会影响FLWOR表达式中return返回的结果顺序,不会对原始XML数据的结构产生任何修改。