Klauzule FROM (dotaz NoSQL)
PLATÍ PRO: NoSQL
Klauzule FROM (FROM <from_specification>
) je nepovinná, pokud zdroj není filtrován nebo promítnut později v dotazu. Dotaz, jako je SELECT * FROM products
výčet nad celým kontejnerem, bez ohledu na název. Místo názvu kontejneru můžete použít speciální identifikátor ROOT
kontejneru.
Klauzule FROM
vynucuje pro každý dotaz následující pravidla:
- Kontejner může být aliasovaný, například
SELECT p.id FROM products AS p
nebo jednodušeSELECT p.id FROM products p
.p
Tady je alias kontejneru. Kontejner nemusí být nutně pojmenovanýproducts
nebop
.AS
je volitelné klíčové slovo pro alias identifikátoru. - Po vytvoření aliasu se původní název zdroje nedá svázat. Je například syntakticky neplatný,
SELECT products.id FROM products p
protože identifikátorproducts
byl aliasován a už se nedá přeložit. - Všechny odkazované vlastnosti musí být plně kvalifikované, aby nedocházelo k nejednoznačným vazbám bez striktního dodržování schématu. Je například syntakticky neplatný,
SELECT id FROM products p
protože vlastnostid
není vázána. Dotaz by měl místo toho odkazovat na vlastnostid
pomocíp.id
(nebo<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 ']'
Argumenty
Popis | |
---|---|
<from_source> |
Určuje zdroj dat s aliasem nebo bez ho. Pokud alias není zadaný, odvodí se z <container_expression> následujících pravidel. Pokud je výrazem , container_name použije container_name se jako alias. Pokud je <container_expression> výraz , použije property_name se jako alias. Pokud je výrazem , container_name použije container_name se jako alias. |
PROTOŽE input_alias |
Určuje, že input_alias je sada hodnot vrácených podkladovým výrazem kontejneru. |
input_alias V |
Určuje, že input_alias by měl představovat sadu hodnot získaných iterací všech prvků pole každého pole vráceného podkladovým výrazem kontejneru. Jakákoli hodnota vrácená podkladovým výrazem kontejneru, který není polem, se ignoruje. |
<container_expression> |
Určuje výraz kontejneru, který se má použít k načtení položek. |
ROOT |
Určuje, že položka by se měla načíst z výchozího, aktuálně připojeného kontejneru. |
container_name |
Určuje, že položka by se měla načíst z poskytnutého kontejneru. Název kontejneru se musí shodovat s názvem kontejneru, ke kterému je aktuálně připojený. |
input_alias |
Určuje, že položka by měla být načtena z jiného zdroje definovaného zadaným aliasem. |
<container_expression> '.' property_name |
Určuje, že položka by měla být načtena přístupem k property_name vlastnosti. |
<container_expression> '[' "property_name" \| array_index ']' |
Určuje, že položka by měla být načtena přístupem k property_name vlastnosti nebo array_index prvku pole pro všechny položky načtené zadaným výrazem kontejneru. |
Poznámky
Všechny zadané aliasy nebo odvozené v <from_source>
(s) musí být jedinečné. Syntaxe <container_expression> '.' property_name
je stejná jako <container_expression> '[' "property_name" ']'
. Druhou syntaxi lze však použít, pokud název vlastnosti obsahuje neidentifikátor znak.
Zpracování chybějících vlastností, chybějících prvků pole a nedefinovaných hodnot
Pokud výraz kontejneru přistupuje k vlastnostem nebo prvkům pole a tato hodnota neexistuje, tato hodnota se ignoruje a nezpracuje se dále.
Rozsah kontextu výrazu kontejneru
Výraz kontejneru může mít obor kontejneru nebo obor položky:
Výraz je vymezený kontejnerem, pokud je podkladovým zdrojem výrazu kontejneru nebo
ROOT
container_name
. Takový výraz představuje sadu položek načtených z kontejneru přímo a není závislý na zpracování jiných výrazů kontejneru.Výraz je vymezený položkou, pokud je
input_alias
podkladový zdroj výrazu kontejneru zaveden dříve v dotazu. Takový výraz představuje sadu položek získaných vyhodnocením výrazu kontejneru. Toto vyhodnocení se provádí v oboru každé položky, která patří do sady přidružené k kontejneru aliasů. Výsledná sada je sjednocení sad získaných vyhodnocením výrazu kontejneru pro každou položku v podkladové sadě.
Příklady
V tomto prvním příkladu FROM
se klauzule používá k určení aktuálního kontejneru jako zdroje, jeho jedinečnému názvu a následnému aliasu. Alias se pak použije k projektování konkrétních polí ve výsledcích dotazu.
SELECT VALUE {
name: e.name,
location: e.workLocation
}
FROM
employees e
[
{
"name": "Tijana Stanković",
"location": {
"office": "Redmond, WA"
}
},
{
"name": "Jean Nadeau",
"location": {
"type": "Remote"
}
}
]
V tomto dalším příkladu FROM
může klauzule také snížit zdroj na menší podmnožinu. Pokud chcete vytvořit výčet pouze podstromu v každé položce, může se podroot stát zdrojem. Pole nebo podroot objektu lze použít jako zdroj.
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"
}
]