Clausola FROM (query NoSQL)
SI APPLICA A: NoSQL
La clausola FROM (FROM <from_specification>
) è facoltativa, a meno che l'origine non venga filtrata o proiettata in un secondo momento nella query. Una query come SELECT * FROM products
enumera su un intero contenitore indipendentemente dal nome. È anche possibile usare l'identificatore ROOT
speciale per il contenitore anziché usare il nome del contenitore.
La FROM
clausola 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
.p
Di seguito è 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,
SELECT products.id FROM products p
è sintatticamente non valido perché l'identificatoreproducts
è stato aliasato e non può più essere risolto. - 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,
SELECT id FROM products p
è sintatticamente non valido 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> , viene property_name 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 POLLICI |
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 fornito. |
<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 della matrice per tutti gli elementi recuperati dall'espressione contenitore specificata. |
Commenti
Tutti gli alias forniti o dedotti in <from_source>
(s) devono essere univoci. La sintassi <container_expression> '.' property_name
è uguale a <container_expression> '[' "property_name" ']'
. Tuttavia, questa sintassi può essere utilizzata 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 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.
Esempio
In questo primo esempio la FROM
clausola viene usata per specificare il contenitore corrente come origine, assegnargli un nome univoco e quindi eseguire 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 sottoradica 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"
}
]