OrderBy中“最大空”和“最小空”的作用是什么

在阅读MarkLogic Query Performance and Tuning Guide,我知道empty greatestempty least以及它如何可以使用order by。但是,除此之外,没有太多细节或示例可供理解:

您可以指定最大的空或最小的空,但空总是需要在最后,优化才能使订单起作用。例如,空最大优化为升序;空最小优化为降序。如果两者都未指定,MarkLogic 将选择优化的顺序。以下示例违背了默认设置。它按 $doc/document/modified_date 对列表进行升序排列,最少为空:

xquery version "1.0-ml";
for $doc in fn:doc()
order by $doc/document/modified_date ascending empty least
return $doc

任何人都可以帮助我了解empty greatestand的实际用例empty least吗?

回答

在 XQuery 规范https://www.w3.org/TR/xquery-31/#id-order-by-clause 中,它被解释为

为了确定它们在排序序列中的相对位置,两个 orderspec 值 W 和 V 之间的大于关系定义如下:

当 orderspec 指定最少空时,按顺序应用以下规则:

如果 V 是空序列且 W 不是空序列,则 W 大于 V 为真。

如果 V 是 NaN 并且 W 既不是 NaN 也不是空序列,则 W 大于 V 为真。

如果指定了特定的归类 C,并且 V 和 W 都是 xs:string 类型或可通过子类型替换和/或类型提升转换为 xs:string,则:

如果 fn:compare(V, W, C) 小于零,则 W 大于 V 为真;否则 W 大于 V 为假。

如果上述规则都不适用,则:

如果 W gt V 为真,则 W 大于 V 为真;否则 W 大于 V 为假。

当 orderspec 指定最大空时,按顺序应用以下规则:

如果 W 是空序列且 V 不是空序列,则 W 大于 V 为真。

如果 W 是 NaN 并且 V 既不是 NaN 也不是空序列,则 W 大于 V 为真。

如果指定了特定的归类 C,并且 V 和 W 都是 xs:string 类型或可通过子类型替换和/或类型提升转换为 xs:string,则:

如果 fn:compare(V, W, C) 小于零,则 W 大于 V 为真;否则 W 大于 V 为假。

如果上述规则都不适用,则:

如果 W gt V 为真,则 W 大于 V 为真;否则 W 大于 V 为假。

基本上,如果在 order by 子句中使用的表达式为要排序的项目提供空序列,则empty least声明在具有非空排序键的项目之前对其进行排序,而empty greatest在这些项目之后对其进行排序。

一个简单的例子:

XQuery

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

declare option output:method 'xml';
declare option output:indent 'yes';

for $item in root/item
order by $item/name, $item/cat empty greatest
return $item

排序

<root>
    <item>
        <name>a</name>
        <cat>z</cat>
    </item>
    <item>
        <name>a</name>
    </item>
    <item>
        <name>a</name>
        <cat>d</cat>
    </item>
</root>

进入

<item>
   <name>a</name>
   <cat>d</cat>
</item>
<item>
   <name>a</name>
   <cat>z</cat>
</item>
<item>
   <name>a</name>
</item>

https://xqueryfiddle.liberty-development.net/eiZQFp9/1


以上是OrderBy中“最大空”和“最小空”的作用是什么的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>