SELECT 子句(NoSQL 查询))

适用范围: NoSQL

每个查询按 ANSI SQL 标准由 SELECT 子句和可选的 FROMWHERE 子句组成。 通常,将枚举 FROM 子句中的源,WHERE 子句对该源应用一个筛选器,以检索 JSON 项的子集。 然后,SELECT 子句在 select 列表中投影请求的 JSON 值。

语法

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 ]

参数

说明
<select_specification> 要为结果集选择的属性或值。
'*' 指定应当在不进行任何更改的情况下检索值。 具体来说,如果处理的值是一个对象,会检索所有属性。
<object_property_list> 指定要检索的属性的列表。 每个返回值是一个具有指定属性的对象。
VALUE 指定应当检索 JSON 值而非整个 JSON 对象。 此参数与 <property_list> 不同,它不会将投影值包装在对象中。
DISTINCT 指定应删除投影属性的重复项。
<scalar_expression> 表示待计算值的表达式。 有关详细信息,请参阅 标量表达式 部分。

示例

第一个示例选择两个静态字符串值,并返回一个数组,其中包含包含这两个值的单个对象。 由于值未命名,因此使用连续生成的数字来命名等效 json 字段。

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

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

SELECT {
    department: "Sales",
    team: "Field sales"
}
[
  {
    "$1": {
      "department": "Sales",
      "team": "Field sales"
    }
  }
]

此示例演示如何平展上一示例中的结果集以简化分析。 此处使用 VALUE 关键字来防止结果包装到另一个 JSON 对象中。

SELECT VALUE {
    department: "Sales",
    team: "Field sales"
}
[
  {
    "department": "Sales",
    "team": "Field sales"
  }
]

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

SELECT VALUE "Sales"
[
  "Sales"
]

在此最后一个示例中,假设有一个容器,其中包含两个具有不同数据类型的字段的项。

[
  {
    "team": "Field sales",
    "identity": {
      "name": "Parker McLean"
    },
    "contact": [
      "206-555-0147"
    ]
  },
  {
    "team": "Field sales",
    "identity": {
      "name": "Beibit Shayakhmet"
    },
    "contact": [
      "206-555-0178"
    ]
  }
]

最后一个示例查询使用 SELECT 子句、VALUE 关键字、FROM 子句和 JSON 投影的组合来执行通用查询,并将结果转换为 JSON 对象供客户端分析。

SELECT VALUE {
    name: e.identity.name,
    team: e.team,
    phone: e.contact[0]
}
FROM
    employees e
[
  {
    "name": "Parker McLean",
    "team": "Field sales",
    "phone": "206-555-0147"
  },
  {
    "name": "Beibit Shayakhmet",
    "team": "Field sales",
    "phone": "206-555-0178"
  }
]

注解

  • 只有当 FROM 子句已声明一个别名时,SELECT * 语法才有效。 SELECT * 提供了标识投影,在不需要投影时可能十分有用。 只有当指定了 FROM 子句,并且该字句只引入单个输入源时,SELECT * 才有效。
  • 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...]