FROM 子句 (NoSQL 查詢)

適用於:NoSQL

之後除非查詢中的來源經過篩選或指定,否則 FROM (FROM <from_specification>) 子句並非必要。 類似的 SELECT * FROM products 查詢會列舉整個容器,而不論名稱為何。 您也可以使用容器的特殊識別碼 ROOT ,而不是使用容器名稱。

FROM 子句會對每個查詢施行下規則:

  • 您可以為容器設定別名,例如 SELECT p.id FROM products AS p 或只是 SELECT p.id FROM products pp以下是容器的別名。 容器不一定需要命名 products 為 或 pAS是別名標識碼的選擇性關鍵詞
  • 別名之後,就無法系結原始來源名稱。 例如,SELECT products.id FROM products p 會因為識別碼 products 指定了別名,導致在語法上無效,而且無法再行解析。
  • 所有參考的屬性必須完整,以避免因為不符合嚴格架構,而發生不明確的繫結。 例如,SELECT id FROM products p 會因為屬性 id 未繫結而導致語法無效。 查詢應該改用 p.id (或<alias>.<property-name>) 參考 屬性id

語法

FROM <from_specification>  
  
<from_specification> ::=
        <from_source> {[ JOIN <from_source>][,...n]}  
  
<from_source> ::=
          <container_expression> [[AS] input_alias]  
        | input_alias IN <container_expression>  
  
<container_expression> ::=
        ROOT
     | container_name  
     | input_alias  
     | <container_expression> '.' property_name  
     | <container_expression> '[' "property_name" | array_index ']'

引數

描述
<from_source> 指定包含或不包含別名的資料來源。 如果未指定別名,則會使用下列規則從 <container_expression> 推斷。 如果表達式是 container_name,則會 container_name 當做別名使用。 如果表達式為 <container_expression>,則會 property_name 當做別名使用。 如果表達式是 container_name,則會 container_name 當做別名使用。
input_alias 指定 input_alias 為一組由基礎容器運算式傳回的值。
input_alias 指定 input_alias 應該代表一組透過反覆計算所有陣列元素所取得的值,其中會依基礎容器運算式傳回每個陣列。 會忽略基礎容器表達式所傳回的任何值,但不是陣列。
<container_expression> 指定要用來擷取專案的容器表達式。
ROOT 指定項目應該從預設且目前連接的容器中擷取。
container_name 指定應該從提供的容器擷取專案。 容器名稱必須與目前所連線容器的名稱相符。
input_alias 指定項目應該從所提供的別名所定義的其他來源擷取。
<container_expression> '.' property_name 指定應該藉由存取 property_name 屬性來擷取專案。
<container_expression> '[' "property_name" \| array_index ']' 指定項目應該藉由存取 property_name 指定容器表達式所擷取之所有項目的屬性或 array_index 陣列專案來擷取。

備註

<from_source> 中提供的所有別名或推斷必須是唯一的。 <container_expression> '.' property_name 的語法與 <container_expression> '[' "property_name" ']' 相同。 不過,如果屬性名稱包含非identifier 字元,則可以使用後者的語法。

處理遺漏的屬性、遺漏的陣列元素及未定義的值

如果容器表達式存取屬性或數位元素,且該值不存在,則會忽略該值,而不會進一步處理。

容器運算式內容範圍

容器運算式可以是容器範圍或專案範圍:

  • 如果容器表達式的基礎來源為 或 container_name,則表達式為ROOT容器範圍。 這類表達式代表直接從容器擷取的一組專案,而且不相依於其他容器表達式的處理。

  • 如果稍早在查詢中引進容器表達式 input_alias 的基礎來源,表達式就會是專案範圍。 這類表達式代表一組透過評估容器表達式取得的專案。 此評估會在屬於與別名容器相關聯之集合的每個專案範圍內執行。 產生的集合是藉由評估基礎集中每個專案的容器表達式所取得的集合聯集。

範例

在此第一個範例中 FROM ,子句是用來指定目前容器做為來源、提供唯一的名稱,然後將它命名為別名。 別名接著會用來投影查詢結果中的特定欄位。

SELECT VALUE {
    name: e.name,
    location: e.workLocation
}
FROM
    employees e
[
  {
    "name": "Tijana Stanković",
    "location": {
      "office": "Redmond, WA"
    }
  },
  {
    "name": "Jean Nadeau",
    "location": {
      "type": "Remote"
    }
  }
]

在下一個範例中 FROM ,子句也可以將來源縮減為較小的子集。 若要列舉每個專案中的子樹,子根可以成為來源。 陣列或物件子根可以當做來源使用。

SELECT 
    *
FROM
    employees.employment e
[
  {
    "hireDateTime": "2023-01-01T06:30:00.000Z",
    "weeklyHours": 40,
    "team": "Retail support"
  },
  {
    "hireDateTime": "2023-01-01T09:30:00.000Z",
    "team": "Retail support"
  },
  {
    "hireDateTime": "2023-01-01T15:30:00.000Z",
    "weeklyHours": 32,
    "team": "Retail support"
  }
]