Clausola FROM (query NoSQL)
SI APPLICA A: NoSQL
La clausola FROM (FROM <from_specification>
) è facoltativa, a meno che l'origine non sia filtrata o prevista più avanti nella query. Una query come SELECT * FROM products
enumera un intero contenitore indipendentemente dal nome. È anche possibile usare l'identificatore ROOT
speciale per il contenitore anziché usare il nome del contenitore.
La clausola FROM
applica le regole seguenti per ogni query:
- È possibile effettuare l'aliasing del contenitore, come in
SELECT p.id FROM products AS p
o semplicemente inSELECT p.id FROM products p
. Di seguito èp
riportato l'alias per il contenitore. Il contenitore non deve necessariamente essere denominatoproducts
op
.AS
è una parola chiave facoltativa per eseguire l'alias dell'identificatore. - Dopo aver eseguito l'alias, il nome di origine originale non può essere associato. Ad esempio, la sintassi di
SELECT products.id FROM products p
non è valida perché è stato eseguito l'aliasing dell'identificatoreproducts
e non è più possibile risolverlo. - Tutte le proprietà a cui si fa riferimento devono essere complete, per evitare associazioni ambigue in assenza di una rigorosa conformità allo schema. Ad esempio, la sintassi di
SELECT id FROM products p
non è valida, perché la proprietàid
non è associata. La query deve invece fare riferimento alla proprietàid
usandop.id
(o<alias>.<property-name>
).
Sintassi
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 ']'
Argomenti
Descrizione | |
---|---|
<from_source> |
Specifica un'origine dati, con o senza un alias. Se l'alias non viene specificato, viene dedotto dall'uso delle <container_expression> regole seguenti. Se l'espressione è un container_name oggetto , container_name viene usato come alias. Se l'espressione è <container_expression> , property_name viene usata come alias. Se l'espressione è un container_name oggetto , container_name viene usato come alias. |
COME input_alias |
Specifica che l'oggetto input_alias è un set di valori restituiti dall'espressione di contenitore sottostante. |
input_alias IN |
Specifica che input_alias deve rappresentare il set di valori ottenuto eseguendo l'iterazione su tutti gli elementi di ogni matrice restituita dall'espressione di contenitore sottostante. Qualsiasi valore restituito dall'espressione contenitore sottostante che non è una matrice viene ignorato. |
<container_expression> |
Specifica l'espressione contenitore da utilizzare per recuperare gli elementi. |
ROOT |
Specifica che l'elemento deve essere recuperato dal contenitore predefinito, attualmente connesso. |
container_name |
Specifica che l'elemento deve essere recuperato dal contenitore fornito. Il nome del contenitore deve corrispondere al nome del contenitore a cui si è attualmente connessi. |
input_alias |
Specifica che l'elemento deve essere recuperato dall'altra origine definita dall'alias specificato. |
<container_expression> '.' property_name |
Specifica che l'elemento deve essere recuperato accedendo alla property_name proprietà . |
<container_expression> '[' "property_name" \| array_index ']' |
Specifica che l'elemento deve essere recuperato accedendo alla proprietà o array_index all'elemento property_name matrice per tutti gli elementi recuperati dall'espressione contenitore specificata. |
Osservazioni:
Tutti gli alias specificati o dedotti in <from_source>
devono essere univoci. La sintassi <container_expression> '.' property_name
è uguale a <container_expression> '[' "property_name" ']'
. Tuttavia, quest'ultima sintassi può essere usata se un nome di proprietà contiene un carattere nonidentifier.
Gestione proprietà mancanti, elementi di matrice mancanti e valori non definiti
Se un'espressione contenitore accede a proprietà o elementi di matrice e tale valore non esiste, tale valore viene ignorato e non elaborato ulteriormente.
Definizione dell'ambito per il contesto dell'espressione di contenitore
Un'espressione contenitore può essere con ambito contenitore o con ambito elemento:
Un'espressione è con ambito contenitore, se l'origine sottostante dell'espressione contenitore è
ROOT
ocontainer_name
. Tale espressione rappresenta un set di elementi recuperati direttamente dal contenitore e non dipende dall'elaborazione di altre espressioni del contenitore.Un'espressione è con ambito elemento, se l'origine sottostante dell'espressione contenitore viene
input_alias
introdotta in precedenza nella query. Tale espressione rappresenta un set di elementi ottenuti valutando l'espressione del contenitore. Questa valutazione viene eseguita nell'ambito di ogni elemento appartenente al set associato al contenitore con alias. Il set risultante è un'unione di set ottenuti valutando l'espressione contenitore per ognuno degli elementi nel set sottostante.
Esempi
In questo primo esempio la FROM
clausola viene usata per specificare il contenitore corrente come origine, assegnargli un nome univoco e quindi eseguirne l'alias. L'alias viene quindi usato per proiettare campi specifici nei risultati della query.
SELECT VALUE {
name: e.name,
location: e.workLocation
}
FROM
employees e
[
{
"name": "Tijana Stanković",
"location": {
"office": "Redmond, WA"
}
},
{
"name": "Jean Nadeau",
"location": {
"type": "Remote"
}
}
]
In questo esempio successivo, la FROM
clausola può anche ridurre l'origine a un subset più piccolo. Per enumerare solo un sottoalbero in ogni elemento, la sottoroot può diventare l'origine. Una matrice o una sottosezione dell'oggetto può essere usata come origine.
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"
}
]