Share via


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 in SELECT p.id FROM products p. p Di seguito è 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, SELECT products.id FROM products p è sintatticamente non valido perché l'identificatore products è 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 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>, viene property_name 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 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 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 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"
  }
]