Cláusula FROM (consulta NoSQL)
APLICA-SE A: NoSQL
A cláusula FROM (FROM <from_specification>
) é opcional, a menos que a fonte seja filtrada ou projetada posteriormente na consulta. Uma consulta como SELECT * FROM products
enumera em um contêiner inteiro, independentemente do nome. Você também pode usar o identificador ROOT
especial para o contêiner em vez de usar o nome do contêiner.
A FROM
cláusula impõe as seguintes regras por consulta:
- O contêiner pode ser aliased, como
SELECT p.id FROM products AS p
ou simplesmenteSELECT p.id FROM products p
. Aqui,p
é o alias para o contêiner. O contêiner não precisa necessariamente ser nomeadoproducts
oup
.AS
é uma palavra-chave opcional para o alias do identificador. - Uma vez aliased, o nome de origem original não pode ser vinculado. Por exemplo,
SELECT products.id FROM products p
é sintaticamente inválido porque o identificadorproducts
foi aliased e não pode mais ser resolvido. - Todas as propriedades referenciadas devem ser totalmente qualificadas, para evitar quaisquer ligações ambíguas na ausência de adesão estrita ao esquema. Por exemplo,
SELECT id FROM products p
é sintaticamente inválido porque a propriedadeid
não está vinculada. Em vez disso, a consulta deve fazer referência à propriedadeid
usandop.id
(ou<alias>.<property-name>
).
Sintaxe
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 ']'
Argumentos
Description | |
---|---|
<from_source> |
Especifica uma fonte de dados, com ou sem um alias. Se o alias não for especificado, ele será inferido a partir das <container_expression> regras a seguir. Se a expressão for um container_name , então container_name é usado como um alias. Se a expressão for <container_expression> , então property_name é usada como um alias. Se a expressão for um container_name , então container_name é usado como um alias. |
COMO input_alias |
Especifica que o input_alias é um conjunto de valores retornados pela expressão de contêiner subjacente. |
input_alias EM |
Especifica que o input_alias deve representar o conjunto de valores obtidos pela iteração sobre todos os elementos da matriz de cada matriz retornada pela expressão de contêiner subjacente. Qualquer valor retornado pela expressão de contêiner subjacente que não seja uma matriz é ignorado. |
<container_expression> |
Especifica a expressão de contêiner a ser usada para recuperar os itens. |
ROOT |
Especifica que o item deve ser recuperado do contêiner padrão conectado no momento. |
container_name |
Especifica que o item deve ser recuperado do contêiner fornecido. O nome do contêiner deve corresponder ao nome do contêiner ao qual está conectado no momento. |
input_alias |
Especifica que o item deve ser recuperado da outra fonte definida pelo alias fornecido. |
<container_expression> '.' property_name |
Especifica que o item deve ser recuperado acessando a property_name propriedade. |
<container_expression> '[' "property_name" \| array_index ']' |
Especifica que o item deve ser recuperado acessando a propriedade ou array_index o property_name elemento array para todos os itens recuperados pela expressão de contêiner especificada. |
Observações
Todos os aliases fornecidos ou inferidos no <from_source>
(s) seu(s) devem ser exclusivos. A sintaxe <container_expression> '.' property_name
é a mesma que <container_expression> '[' "property_name" ']'
. No entanto, a última sintaxe pode ser usada se um nome de propriedade contiver um caractere não identificador.
Manipulando propriedades ausentes, elementos de matriz ausentes e valores indefinidos
Se uma expressão de contêiner acessar propriedades ou elementos de matriz e esse valor não existir, esse valor será ignorado e não processado posteriormente.
Escopo de contexto de expressão de contêiner
Uma expressão de contêiner pode ter escopo de contêiner ou de item:
Uma expressão tem escopo de contêiner, se a origem subjacente da expressão de contêiner for ou
ROOT
container_name
. Essa expressão representa um conjunto de itens recuperados diretamente do contêiner e não depende do processamento de outras expressões de contêiner.Uma expressão tem escopo de item, se a fonte subjacente da expressão de contêiner for
input_alias
introduzida anteriormente na consulta. Tal expressão representa um conjunto de itens obtidos pela avaliação da expressão de contêiner. Esta avaliação é realizada no âmbito de cada item pertencente ao conjunto associado ao contentor com aliased. O conjunto resultante é uma união de conjuntos obtida pela avaliação da expressão de contêiner para cada um dos itens no conjunto subjacente.
Exemplos
Neste primeiro exemplo, a FROM
cláusula é usada para especificar o contêiner atual como uma origem, dar-lhe um nome exclusivo e, em seguida, um alias. O alias é então usado para projetar campos específicos nos resultados da consulta.
SELECT VALUE {
name: e.name,
location: e.workLocation
}
FROM
employees e
[
{
"name": "Tijana Stanković",
"location": {
"office": "Redmond, WA"
}
},
{
"name": "Jean Nadeau",
"location": {
"type": "Remote"
}
}
]
Neste próximo exemplo, a FROM
cláusula também pode reduzir a origem a um subconjunto menor. Para enumerar apenas uma subárvore em cada item, a subraiz pode se tornar a fonte. Uma matriz ou subraiz de objeto pode ser usada como fonte.
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"
}
]