Sdílet prostřednictvím


Klauzule FROM (dotaz NoSQL)

PLATÍ PRO: NoSQL

Klauzule FROM (FROM <from_specification>) je volitelná, pokud není zdroj filtrovaný nebo promítaný později v dotazu. Dotaz jako SELECT * FROM products vytvoří výčet celého kontejneru bez ohledu na název. Místo názvu kontejneru můžete také použít speciální identifikátor ROOT kontejneru.

Klauzule FROM vynucuje následující pravidla pro každý dotaz:

  • Kontejner může mít alias, 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í mít nutně název products nebo p. AS je volitelné klíčové slovo pro alias identifikátoru.
  • Po nasazení aliasu není možné svázat původní název zdroje. Například je syntakticky neplatný, SELECT products.id FROM products p protože identifikátor products má alias a už ho nejde přeložit.
  • Všechny odkazované vlastnosti musí být plně kvalifikované, aby se zabránilo nejednoznačným vazbám při absenci striktního dodržování schématu. Například je 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

Description
<from_source> Určuje zdroj dat s aliasem nebo bez aliasu. Pokud alias není zadaný, odvodí se z následujících <container_expression> pravidel. Pokud je výraz , container_namepoužije se container_name jako alias. Pokud je <container_expression>výraz , použije se property_name jako alias. Pokud je výraz , container_namepoužije se container_name jako alias.
JAKO input_alias Určuje, že input_alias je sada hodnot vrácených podkladovým výrazem kontejneru.
input_alias IN Určuje, že input_alias by měl představovat množinu hodnot získaných iterací všech prvků pole každého pole vrácené výrazem základního kontejneru. Všechny hodnoty vrácené podkladovým výrazem kontejneru, které nejsou polem, se ignorují.
<container_expression> Určuje výraz kontejneru, který se má použít k načtení položek.
ROOT Určuje, že se má položka načíst z výchozího aktuálně připojeného kontejneru.
container_name Určuje, že se má položka načíst ze zadané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 se má položka načíst z druhého zdroje definovaného zadaným aliasem.
<container_expression> '.' property_name Určuje, že se má položka načíst přístupem k property_name vlastnosti .
<container_expression> '[' "property_name" \| array_index ']' Určuje, že se má položka načíst přístupem k elementu property_name vlastnosti nebo array_index pole pro všechny položky načtené zadaným výrazem kontejneru.

Poznámky

Všechny aliasy zadané nebo odvozené v <from_source>(s) musí být jedinečné. Syntaxe je stejná jako <container_expression> '[' "property_name" ']'.<container_expression> '.' property_name Druhou syntaxi lze však použít, pokud název vlastnosti obsahuje znak, který není identifikátorem.

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, bude tato hodnota ignorována a nebude se dále zpracovávat.

Rozsah kontextu výrazu kontejneru

Výraz kontejneru může být vymezený na kontejner nebo na položku:

  • Výraz má obor kontejneru, pokud je podkladovým zdrojem výrazu kontejneru nebo ROOTcontainer_name. Takový výraz představuje sadu položek načtených přímo z kontejneru a není závislý na zpracování jiných výrazů kontejneru.

  • Výraz má obor položek, pokud je input_alias podkladový zdroj výrazu kontejneru představen 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é ke kontejneru s aliasy. 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, zadání jedinečného názvu a následnému aliasu. Alias se pak použije k promítaní 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 může klauzule FROM také snížit zdroj na menší podmnožinu. Chcete-li vypsat pouze podstrom v každé položce, může se zdroj stát podstrom. Jako zdroj lze použít pole nebo podroot objektu.

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"
  }
]