SELECT 子句 (NoSQL 查詢)
適用於:NoSQL
每個查詢都包含 SELECT
子句和選擇性 FROM
的 和 WHERE
子句,每個 ANSI SQL 標準。 通常會列舉 FROM
子句中的來源,而 WHERE
子句會在來源上套用篩選,以擷取 JSON 項目的子集。 接著 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 對象的確切結構和功能變數名稱。 在這裡,會使用名為 department
和 team
的欄位來建立 JSON 物件。 外部 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"
]
}
]
這個最後一個範例查詢會使用 子句、VALUE
關鍵詞、FROM
子句和 JSON 投影的組合SELECT
來執行一般查詢,並將結果轉換成 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 *
提供一個身分識別投影,在無需投影的情況下會非常實用。SELECT *
只有在指定 子句且只引進單一輸入來源時才有效FROM
。 - 和
SELECT *
都是SELECT <select_list>
「語法糖」,也可以使用簡單的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...]
。