Condividi tramite


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 in SELECT p.id FROM products p. Di seguito è p riportato l'alias per il contenitore. Il contenitore non deve necessariamente essere denominato products o p. 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'identificatore products 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 usando p.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_nameoggetto , container_name viene usato come alias. Se l'espressione è <container_expression>, property_name viene usata come alias. Se l'espressione è un container_nameoggetto , 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 o container_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"
  }
]