SELECT 子句(NoSQL 查询))
适用范围: NoSQL
每个查询按 ANSI SQL 标准由 SELECT
子句和可选的 FROM
和 WHERE
子句组成。 通常,将枚举 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 对象,其中包含名为 department
和 team
的字段。 外部 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...]
。