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 物件的確切結構和功能變數名稱。 在這裡,會使用名為 departmentteam 的欄位來建立 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"
    ]
  }
]

這個最後一個 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"
  }
]

備註

  • SELECT *只有在 FROM 子句宣告了一個別名時,語法才有效。 SELECT * 提供一個身分識別投影,在無需投影的情況下會非常實用。 SELECT * 只有在指定 子句且只引進單一輸入來源時才 FROM 有效。
  • SELECT * 都是 SELECT <select_list> 「語法 sugar」,也可以使用簡單 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...]