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 simplementSELECT 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
oup
.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’identificateurproducts
, 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’aidep.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
oucontainer_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"
}
]