为什么我们在 xquery 表达式中的 order by 子句后面使用 [1]?

Why do we use [1] behind an order by clause in xquery expressions?

SELECT xText.query (' let $planes := /planes/plane
return <results>
{
  for $x in $planes
  where $x/year >= 1970
  order by ($x/year)[1]
  return ($x/make, $x/model,$x/year )
}
</results>
')
FROM planes

在此代码中,第 order by ($x/year)[1]

行中 [1] 的用途是什么

我曾尝试在不使用 order by 子句后面的 [1] 的情况下执行此代码。那么就出现了这个错误。

XQuery [planes.xtext.query()]: 'order by' requires a singleton (or empty sequence), found operand of type 'xtd:untypedAtomic*'

[1] 是一个谓词,它正在选择序列中的第一项。它等同于表达式 [position() = 1]。 XPath 中的谓词有点像 SQL 中的 WHERE 子句。应用过滤器,选择 returns true 的任何内容,不选择 return false 的内容。

如果不应用谓词,就会出现错误。该错误是说 order by 需要单个项目,或者什么都没有(空序列)。

至少有一个 plane 有多个 year,因此谓词确保只有第一个用于 order by 表达式。

XQuery 1.0 定义了一个名为“静态类型检查”的选项:如果此选项生效,您需要以编译器可以提前(“静态”)告知结果不会出现的方式编写查询是类型错误。 “order by”的操作数需要是一个单例,并且通过强制静态类型检查,编译器需要能够验证它将是一个单例,这就是添加 [1] 的原因。写 exactly-one($x/year) 会更好,因为这不仅让编译器满意,它还需要 run-time 检查 $x/year 实际上是一个单例。

很少有 XQuery 供应商选择实现静态类型检查,在我看来有很好的理由:它使查询更难编写,而且它实际上鼓励您编写像这个示例这样的东西,比没有系统的系统做更少的检查这个“功能”。

事实上,据我所知,唯一进行静态类型检查的主流 (non-academic) 实现是 Microsoft 的 SQL 服务器。

不应将静态类型检查与乐观类型检查混淆,在乐观类型检查中,编译器会告诉您注定会失败的事情,但推迟到 run-time 检查可能正确或可能不正确的事情。

其实以上是一些猜测。也有可能某些 <plane> 元素有多个名为 <year> 的子元素,并且您想对其中的第一个元素进行排序。即使在不进行静态类型检查的产品上,这也证明 [1] 是合理的。