FROM 句 (NoSQL クエリ)

適用対象: NoSQL

ソースがクエリの後半でフィルター処理またはプロジェクションされる場合を除いて、FROM (FROM <from_specification>) 句はオプションです。 SELECT * FROM products のようなクエリでは、名前に関係なくコンテナー全体が列挙されます。 コンテナー名の代わりにコンテナーに特別な識別子 ROOT を使うこともできます。

FROM 句では、クエリごとに次の規則が適用されます。

  • コンテナーは、SELECT p.id FROM products AS p またはシンプルに SELECT p.id FROM products p のようにエイリアス化することができます。 ここで p はコンテナーの別名です。 コンテナーには、必ずしも products または p という名前を付ける必要はありません。 AS は識別子に別名を付けるためのオプションのキーワードです。
  • 別名を付けると、元のソース名をバインドすることはできなくなります。 たとえば、SELECT products.id FROM products p は無効な構文となります。識別子 products がエイリアス化されており、それ以上解決できないためです。
  • 参照されているすべてのプロパティを完全修飾し、厳格なスキーマの準拠がない場合の曖昧なバインドを回避する必要があります。 たとえば、プロパティ id がバインドされていないため、SELECT id FROM products p は無効な構文です。 クエリでは、代わりに 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 が別名として使用されます。
AS input_alias input_alias が基になるコンテナー式によって返される値のセットであることを指定します。
input_alias IN 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" ']' と同じです。 ただし、プロパティ名に非識別子文字が含まれている場合は、後者の構文を使用できます。

見つからないプロパティ、見つからない配列要素、未定義の値の処理

コンテナー式でプロパティまたは配列要素にアクセスし、その値が存在しない場合、値は無視され、処理は行われません。

コンテナー式のコンテキストのスコープ

コンテナー式には、コンテナー スコープまたは項目スコープがあります。

  • 基になるコンテナー式のソースが ROOT または container_name である場合、式はコンテナー スコープです。 このような式は、直接コンテナーから取得された項目のセットを表し、その他のコンテナーの式の処理に依存しません。

  • 基になるコンテナー式のソースが、クエリで前に導入された 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"
  }
]