SELECT - Cosmos DB 中的查询语言

SELECT 子句标识在查询结果中返回的字段。 然后,该子句将这些字段投影到 JSON 结果集中。

每个查询都由一个 SELECT 子句以及可选的 FROMWHERE 子句组成,这符合 ANSI SQL 标准。 通常,会对 FROM 子句中的源进行枚举,而 WHERE 子句则对该源应用筛选条件,以检索 JSON 项的一个子集。

Syntax

SELECT <select_specification>  

<select_specification> ::=
      '*'
      | [DISTINCT] <object_property_list>
      | [DISTINCT] VALUE <scalar_expression> [[ AS ] value_alias]  
  
<object_property_list> ::=
{ <scalar_expression> [ [ AS ] property_alias ] } [ ,...n ]

Arguments

Description
select_specification 要为结果集选择的属性或值。
* 指定应在不进行任何更改的情况下检索该值。 具体而言,如果处理的值是对象,则会检索所有属性。
object_property_list 指定要检索的属性的列表。 每个返回的值都是具有指定属性的对象。
VALUE 指定应检索 JSON 值而不是完整的 JSON 对象。 此参数与 <property_list> 不同,不会将投影值封装在对象中。
DISTINCT 指定应移除投影属性的重复项。
scalar_expression 表示要计算的值的表达式。

返回类型

返回指定的投影字段或值。

例子

本部分包含有关如何使用此查询语言构造的示例。

选择静态字符串值

在此示例中,有两个静态字符串值,并返回包含这两个值的单个对象的数组。 由于值未命名,因此使用顺序生成的数字来命名等效的 json 字段。

SELECT
  "Cosmic", "Works"
[
  {
    "$1": "Cosmic",
    "$2": "Works"
  }
]

项目字段

在此示例中,JSON 投影用于微调生成的 JSON 对象的确切结构和字段名称。 这里,创建了一个 JSON 对象,其中包含名为 identifiermodel 的字段。 外部 JSON 对象仍未命名,因此使用生成的数字 ($1) 来命名此字段。

SELECT {
  identifier: p.name,
  model: p.sku
}
FROM
  products p
[
  {
    "$1": {
      "identifier": "Remdriel Shoes",
      "model": "61506"
    }
  },
  {
    "$1": {
      "identifier": "Tirevy trunks",
      "model": "73402"
    }
  },
  ...
]

项目静态字符串

在此示例中,VALUE 关键字与静态字符串一起使用,以创建字符串数组作为结果。

SELECT VALUE
  "Cosmic Works"
[
  "Cosmic Works"
]

复杂投影

在此示例中,该查询结合使用了 SELECT 子句、VALUE 关键字、FROM 子句和 JSON 投影,以执行一种常见查询,并将结果转换为供客户端解析的 JSON 对象。

SELECT VALUE {
  name: p.name,
  link: p.metadata.link,
  firstTag: p.tags[0]["value"]
}
FROM
  products p
[
  {
    "name": "Remdriel Shoes",
    "link": "https://www.adventure-works.com/remdriel-shoes/68719521615.p",
    "firstTag": "suede-leather-and-mesh"
  },
  {
    "name": "Tirevy trunks",
    "link": "https://www.adventure-works.com/tirevy-trunks/68719520573.p",
    "firstTag": "polyester"
  },
  ...
]

注解

  • 仅当 FROM 子句恰好声明了一个别名时,SELECT * 语法才有效。 SELECT * 提供标识投影,如果不需要投影,这非常有用。 SELECT * 仅在指定了 FROM 子句且只引入了单个输入源时才有效。
  • SELECT <select_list>SELECT * 都是语法糖,都可以使用简单的 SELECT 语句来表示。
  • SELECT * FROM ... AS from_alias ...表达式等效于 SELECT from_alias FROM ... AS from_alias ....
  • SELECT <expr1> AS p1, <expr2> AS p2,..., <exprN> AS pN [other clauses...]表达式等效于 SELECT VALUE { p1: <expr1>, p2: <expr2>, ..., pN: <exprN> }[other clauses...].