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 mais adiante na consulta. Uma consulta como SELECT * FROM products
enumera em um contêiner inteiro, independentemente do nome. Você também pode usar a raiz do identificador especial ROOT
para o contêiner em vez de usar o nome do contêiner.
A cláusula FROM
impõe as seguintes regras por consulta:
- O contêiner pode ser um alias, como
SELECT p.id FROM products AS p
ou simplesmenteSELECT p.id FROM products p
. Aquip
é o alias para o contêiner. O contêiner não precisa necessariamente ser nomeadoproducts
oup
.AS
é uma palavra-chave opcional que serve como alias para o identificador. - Após receber um alias, o nome da fonte original não pode ser associado. Por exemplo,
SELECT products.id FROM products p
é sintaticamente inválido, pois o identificadorproducts
foi transformando em alias e não pode mais ser resolvido. - Todas as propriedades referenciadas devem ser totalmente qualificadas para evitar associações ambíguas na ausência da adesão estrita ao esquema. Por exemplo,
SELECT id FROM products p
é sintaticamente inválido porque a propriedadeid
não está associada. Em vez disso, a consulta deve referenciar a 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
Descrição | |
---|---|
<from_source> |
Especifica uma fonte de dados, com ou sem um alias. Se o alias não é especificado, ele é inferido de <container_expression> usando as seguinte regras. Se a expressão é container_name , container_name é usado como alias. Se a expressão é <container_expression> , property_name é usado como alias. Se a expressão é container_name , container_name é usado como alias. |
COMO input_alias |
Especifica que input_alias é um conjunto de valores retornados pela expressão do contêiner subjacente. |
input_alias EM |
Especifica que input_alias deve representar o conjunto de valores obtidos pela iteração em todos os elementos de 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 será ignorado. |
<container_expression> |
Especifica a expressão do contêiner a ser usada para recuperar os itens. |
ROOT |
Especifica que o item deve ser recuperado do padrão, contêiner atualmente conectado. |
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 atualmente conectado. |
input_alias |
Especifica que o item deve ser recuperado de outra fonte definida pelo alias fornecido. |
<container_expression> '.' property_name |
Especifica que o item deve ser recuperado acessando a propriedade property_name . |
<container_expression> '[' "property_name" \| array_index ']' |
Especifica que o item deve ser recuperado acessando a propriedade property_name ou o elemento de matriz array_index para todos os itens recuperados pela expressão de contêiner especificada. |
Comentários
Todos os aliases fornecidos ou inferidos nos <from_source>
(s) devem ser exclusivos. A sintaxe <container_expression> '.' property_name
é a mesma para <container_expression> '[' "property_name" ']'
. No entanto, a sintaxe desta última pode ser usada se um nome de propriedade contém um caractere não identificador.
Manipulação de propriedades ausentes, elementos de matriz ausentes e valores indefinidos
Se uma expressão de contêiner acessar propriedades ou elementos da matriz e o valor não existe, esse valor é ignorado e não processado.
Escopo do contexto da expressão do contêiner
Uma expressão contêiner pode ter escopo no contêiner ou no escopo do item:
Uma expressão será contida no contêiner, se a origem subjacente da expressão do contêiner for
ROOT
oucontainer_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 terá escopo de itens, se a fonte subjacente da expressão de contêiner for
input_alias
introduzido anteriormente na consulta. Essa expressão representa um conjunto de itens obtidos avaliando a expressão de contêiner. Essa avaliação é executada no escopo de cada item pertencente ao conjunto associado ao contêiner de alias. O conjunto resultante é uma união de conjuntos obtidos pela avaliação da expressão do contêiner para cada um dos itens no conjunto subjacente.
Exemplos
Neste primeiro exemplo, a cláusula FROM
é usada para especificar o contêiner atual como uma origem, dar a ele um nome exclusivo e, em seguida, criar o alias. Em seguida, o alias é 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 cláusula FROM
também pode reduzir a origem para um subconjunto menor. Para enumerar somente uma subárvore de cada item, a sub-raiz pode se tornar a fonte. Uma subroot de matriz ou objeto pode ser usada como uma origem.
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"
}
]