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še SELECT p.id FROM products p. p Tady je alias kontejneru. Kontejner nemusí být nutně pojmenovaný products nebo p. 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átor products 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 vlastnost id není vázána. Dotaz by měl místo toho odkazovat na vlastnost id 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_namepoužije container_name se jako alias. Pokud je <container_expression>výraz , použije property_name se jako alias. Pokud je výrazem , container_namepouž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"
  }
]