Clause FROM (requête NoSQL)

S’APPLIQUE À : NoSQL

La clause FROM (FROM <from_specification>) est facultative, sauf si la source est filtrée ou projetée plus loin dans la requête. Une requête comme SELECT * FROM products énumère un conteneur entier, quel que soit le nom. Vous pouvez également utiliser l’identificateur ROOT spécial pour le conteneur au lieu d’utiliser le nom du conteneur.

La clause FROM applique les règles suivantes par requête :

  • Le conteneur peut être un alias, tel que SELECT p.id FROM products AS p ou simplement SELECT p.id FROM products p. Ici, p est l’alias pour le conteneur. Le conteneur n’a pas nécessairement besoin d’être nommé products ou p. AS est un mot clé facultatif pour appliquer un alias à l’identificateur.
  • Une fois l’alias attribué, vous ne pouvez plus lier le nom source d’origine. Par exemple, SELECT products.id FROM products p est syntaxiquement incorrect, car l’identificateur products, qui s’est vu attribuer un alias, ne peut plus être résolu.
  • Toutes les propriétés référencées doivent être complètes, afin d’éviter toute liaison ambiguë en l’absence de conformité de schéma strict. Par exemple, SELECT id FROM products p est syntaxiquement incorrect, car la propriété id n’est pas liée. La requête doit plutôt référencer la propriété id à l’aide p.id de (ou <alias>.<property-name>).

Syntaxe

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 ']'

Arguments

Description
<from_source> Spécifie une source de données, avec ou sans alias. Si aucun alias n’est spécifié, il est déduit à partir de <container_expression> à l’aide des règles suivantes. Si l'expression est un container_name, alors container_name est utilisée comme alias. Si l'expression est <container_expression>, alors property_name est utilisée comme alias. Si l'expression est un container_name, alors container_name est utilisée comme alias.
AS input_alias Spécifie que input_alias est un ensemble de valeurs renvoyées par l’expression de conteneur sous-jacent.
input_alias IN Spécifie que input_alias doit représenter l’ensemble des valeurs obtenues en effectuant une itération sur tous les éléments de tableau de chaque tableau retourné par l’expression de conteneur sous-jacent. Toute valeur retournée par l’expression de conteneur sous-jacent qui n’est pas un tableau est ignorée.
<container_expression> Spécifie l’expression de conteneur à utiliser pour récupérer les éléments.
ROOT Spécifie qu’un élément doit être récupéré à partir du conteneur par défaut, actuellement connecté.
container_name Spécifie qu’un élément doit être récupéré à partir du conteneur fourni. Le nom du conteneur doit correspondre au nom du conteneur actuellement connecté.
input_alias Spécifie que l’élément doit être récupéré à partir de l’autre source définie par l’alias fourni.
<container_expression> '.' property_name Spécifie qu’un élément doit être récupéré en accédant à la propriété property_name.
<container_expression> '[' "property_name" \| array_index ']' Spécifie que l’élément doit être récupéré en accédant à la propriété property_name ou à l’élément de tableau array_index pour tous les éléments récupérés par l’expression de conteneur spécifiée.

Notes

Tous les alias fournis ou déduits dans les <from_source> doivent être uniques. La syntaxe <container_expression> '.' property_name est la même que <container_expression> '[' "property_name" ']'. Toutefois, cette dernière syntaxe peut être utilisée si un nom de propriété contient un caractère hors identificateur.

Gestion des propriétés manquantes, des éléments de tableau manquants et des valeurs non définies

Si une expression de conteneur accède à des propriétés ou éléments de tableau et que la valeur n’existe pas, cette valeur est ignorée et n’est plus traitée.

Étendue de contexte d’expression de conteneur

Une expression de conteneur peut avoir une étendue d’élément ou de conteneur :

  • Une expression est étendue à un conteneur si la source sous-jacente de l’expression de conteneur est ROOT ou container_name. Une telle expression représente un ensemble d’éléments récupérés directement à partir du conteneur, et n’est pas dépendante du traitement d’autres expressions de conteneur.

  • Une expression est étendue à un élément si la source sous-jacente de l’expression de conteneur est input_alias, introduit plus tôt dans la requête. Une telle expression représente un ensemble d’éléments obtenu en évaluant l’expression conteneur. Cette évaluation est effectuée dans l’étendue de chaque élément appartenant au jeu associé au conteneur avec alias. Le jeu résultant est une union de jeux obtenus en évaluant l’expression de conteneur pour chacun des éléments du jeu sous-jacent.

Exemples

Dans ce premier exemple, la FROM clause est utilisée pour spécifier le conteneur actuel en tant que source, lui donner un nom unique, puis l’alias. L’alias est ensuite utilisé pour projeter des champs spécifiques dans les résultats de la requête.

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

Dans cet exemple, la FROM clause peut également réduire la source à un sous-ensemble plus petit. Pour l’énumération d’une seule sous-arborescence de chaque élément, le sous-dossier racine peut devenir la source. Une sous-racine de tableau ou d’objet peut être utilisée comme source.

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"
  }
]