为什么我们在 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]
是合理的。
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]
是合理的。