Compartir a través de

FROM 子句(NoSQL 查询)

适用范围: NoSQL

FROM (FROM <from_specification>) 子句是可选的,除非稍后在查询中对源进行筛选或投影。 此类 SELECT * FROM products 查询将枚举整个容器,而不考虑名称。 还可以对容器使用特殊标识符 ROOT,而无需使用容器名称。

FROM 子句对每个查询强制实施以下规则:

  • 容器可以使用别名,如 SELECT p.id FROM products AS p 或只需为 SELECT p.id FROM products p。 此处的 p 是容器的别名。 容器不一定需要命名为 productspAS 是可选的关键字,用于为标识符取 别名
  • 指定别名后,无法绑定原始的源名称。 例如,SELECT products.id FROM products p 在语法上是无效的,原因是标识符 products 已指定别名,因此不再可以解析。
  • 所有被引用的属性必须完全限定,以避免在不严格遵守架构时出现任何有歧义的绑定。 例如,SELECT id FROM products p 在语法上是无效的,因为未绑定属性 id。 查询应改为使用 p.id(或 <alias>.<property-name>) 引用 id 属性。

语法

FROM <from_specification>  
  
<from_specification> ::=
        <from_source> {[ JOIN <from_source>][,...n]}  
  
<from_source> ::=
          <container_expression> [[AS] input_alias]  
        | input_alias IN <container_expression>  
  
<container_expression> ::=
        ROOT
     | container_name  
     | input_alias  
     | <container_expression> '.' property_name  
     | <container_expression> '[' "property_name" | array_index ']'

参数

说明
<from_source> 指定数据源,可以带别名,也可以不带别名。 如果未指定别名,将从 <container_expression> 中使用以下规则推断: 如果表达式为 container_name,那么 container_name 将用作别名。 如果表达式为 <container_expression>,那么 property_name 将用作别名。 如果表达式为 container_name,那么 container_name 将用作别名。
AS input_alias 指定 input_alias 为基础容器表达式返回的一组值。
input_alias IN 指定 input_alias 应表示通过遍历由基础容器表达式返回的每个数组的所有数组元素获得的一组值。 基础容器表达式返回的非数组的任何值都将被忽略。
<container_expression> 指定要用于检索项目的容器表达式。
ROOT 指定应从当前连接的默认容器中检索项目。
container_name 指定应从当前提供的容器中检索项目。 容器的名称必须匹配当前连接到的容器名称。
input_alias 指定应从提供的别名定义的其他源中检索项目。
<container_expression> '.' property_name 指定应通过访问 property_name 属性来检索项目。
<container_expression> '[' "property_name" \| array_index ']' 指定应通过访问由指定容器表达式检索的所有项目的 property_name 属性或 array_index 数组元素来检索项目。

备注

<from_source> 中提供或推断的所有别名必须唯一。 语法 <container_expression> '.' property_name<container_expression> '[' "property_name" ']' 相同。 但是,如果属性名称包含非标识符字符,则可以使用后一种语法。

处理未命中属性、未命中数组元素和未定义值

如果某个容器表达式访问属性或数组元素,但该值不存在,将忽略该值,且不会做进一步处理。

容器表达式上下文范围

容器表达式的范围可以是集合或项目:

  • 如果容器表达式的基础源是 ROOTcontainer_name,则表达式的范围是容器。 此类表达式表示从容器中直接检索的一组项目,且不依赖于其他容器表达式的处理。

  • 如果容器表达式的基础源是之前在查询中引入的 input_alias,则表达式的范围是项目。 此类表达式表示通过计算容器表达式获取的一组项。 此评估在属于与别名容器关联的集的每个项的范围内执行。 结果集为多个集的合并,通过计算基础集中每个项目的容器表达式获得。

示例

在第一个示例中,FROM 子句用于将当前容器指定为源,为其指定唯一名称,然后为其命名。 然后,别名用于在查询结果中投影特定字段。

SELECT VALUE {
    name: e.name,
    location: e.workLocation
}
FROM
    employees e
[
  {
    "name": "Tijana Stankovic",
    "location": {
      "office": "Redmond, WA"
    }
  },
  {
    "name": "Jean Nadeau",
    "location": {
      "type": "Remote"
    }
  }
]

在下一个示例中,FROM 子句还可以将源缩减为较小的子集。 要在每个项中仅枚举子树,子根可能会变成源。 数组或对象子根可用作源。

SELECT 
    *
FROM
    employees.employment e
[
  {
    "hireDateTime": "2023-01-01T06:30:00.000Z",
    "weeklyHours": 40,
    "team": "Retail support"
  },
  {
    "hireDateTime": "2023-01-01T09:30:00.000Z",
    "team": "Retail support"
  },
  {
    "hireDateTime": "2023-01-01T15:30:00.000Z",
    "weeklyHours": 32,
    "team": "Retail support"
  }
]