SELECT command
Importante
O Amazon S3 Select não está mais disponível para novos clientes. Os clientes existentes do Amazon S3 Select podem continuar usando o recurso normalmente. Saiba mais
O Amazon S3 Select só oferece suporte ao comando SQL SELECT
. As seguintes cláusulas padrão ANSI são compatíveis com SELECT
:
-
SELECT
lista -
FROM
Cláusula -
WHERE
Cláusula -
LIMIT
Cláusula
nota
As consultas do Amazon S3 Select não oferecem suporte a subconsultas ou junções no momento.
SELECT lista
A lista SELECT
nomeia as colunas, as funções e as expressões que a consulta deve retornar. A lista representa o resultado da consulta.
SELECT * SELECT
projection1
AScolumn_alias_1
,projection2
AScolumn_alias_2
O primeiro formulário de SELECT
com o *
(asterisco) retorna todas as linhas que passaram na cláusula WHERE
, da maneira como estão. O segundo formulário de SELECT
cria uma linha com expressões escalares de saída definidas pelo usuário
e projection1
para cada coluna.projection2
FROMCláusula
O Amazon S3 Select oferece suporte aos seguintes formatos de cláusula FROM
:
FROM
table_name
FROMtable_name alias
FROMtable_name
ASalias
Em cada forma da cláusula FROM
, table_name
é o S3Object
que está sendo consultado. Os usuários provenientes de bancos de dados relacionais tradicionais podem pensar nisso como um esquema de banco de dados que contém várias visualizações em uma tabela.
Seguindo o SQL padrão, a cláusula FROM
cria linhas filtradas na cláusula WHERE
e projetadas na lista SELECT
.
Para objetos JSON armazenados no Seleção do Amazon S3, você também pode usar as seguintes formas da cláusula FROM
:
FROM S3Object[*].
path
FROM S3Object[*].path alias
FROM S3Object[*].path
ASalias
Com essa forma da cláusula FROM
, você pode selecionar entre matrizes ou objetos em um objeto JSON. É possível especificar path
usando uma das formas a seguir:
-
Por nome (em um objeto):
.
ouname
['
name
'] -
Por índice (em uma matriz):
[
index
] -
Por caractere curinga (em um objeto):
.*
-
Por caractere curinga (em uma matriz):
[*]
nota
-
Essa forma da cláusula
FROM
funciona apenas com objetos JSON. -
Caracteres curingas sempre emitem pelo menos um registro. Se não houver correspondência com nenhum registro, o Seleção do Amazon S3 emitirá o valor
MISSING
. Durante a serialização de saída (após a execução da consulta), o Amazon S3 Select substituirá os valoresMISSING
por registros vazios. -
Funções agregadas (
AVG
,COUNT
,MAX
,MIN
, andSUM
) ignoram valoresMISSING
. -
Se não fornecer um alias ao usar um caractere curinga, você poderá consultar a linha usando o último elemento do caminho. Por exemplo, você pode selecionar todos os preços em uma lista de livros usando a consulta
SELECT price FROM S3Object[*].books[*].price
. Se o caminho terminar com um caractere curinga em vez de um nome, você poderá usar o valor_1
para consultar a linha. Por exemplo, em vez deSELECT price FROM S3Object[*].books[*].price
, você pode usar a consultaSELECT _1.price FROM S3Object[*].books[*]
. -
O Amazon S3 Select sempre trata um documento JSON como uma matriz de valores no nível da raiz. Dessa forma, mesmo se o objeto JSON que você estiver consultando tiver apenas um elemento raiz, a cláusula
FROM
deverá começar comS3Object[*]
. No entanto, por razões de compatibilidade, o Amazon S3 Select permite omitir o caractere curinga caso você não inclua um caminho. Dessa forma, a cláusula completaFROM S3Object
é equivalente aFROM S3Object[*] as S3Object
. Se você incluir um caminho, também deverá usar o caractere curinga. Portanto,FROM S3Object
eFROM S3Object[*].
são clausulas válidas, maspath
FROM S3Object.
não.path
Exemplos:
Exemplo 1
Este exemplo mostra resultados ao usar o seguinte conjunto de dados e consulta:
{ "Rules": [ {"id": "1"}, {"expr": "y > x"}, {"id": "2", "expr": "z = DEBUG"} ]} { "created": "June 27", "modified": "July 6" }
SELECT id FROM S3Object[*].Rules[*].id
{"id":"1"} {} {"id":"2"} {}
O Amazon S3 Select produz cada resultado pelos seguintes motivos:
-
{"id":"id-1"}
:S3Object[0].Rules[0].id
produziu uma correspondência. -
{}
:S3Object[0].Rules[1].id
não teve correspondência com um registro. Portanto, o Amazon S3 Select emitiuMISSING
, que foi, então, alterado para um registro vazio durante a serialização de saída e retornou. -
{"id":"id-2"}
:S3Object[0].Rules[2].id
produziu uma correspondência. -
{}
:S3Object[1]
não teve correspondência emRules
. Portanto, o Amazon S3 Select emitiuMISSING
, que foi, então, alterado para um registro vazio durante a serialização de saída e retornou.
Se você não quiser que o Seleção do Amazon S3 retorne registros vazios quando não encontrar uma correspondência, você poderá testar o valor MISSING
. A consulta a seguir retorna os mesmos resultados que a consulta anterior, mas com os valores vazios omitidos:
SELECT id FROM S3Object[*].Rules[*].id WHERE id IS NOT MISSING
{"id":"1"} {"id":"2"}
Exemplo 2
Este exemplo mostra resultados ao usar o seguinte conjunto de dados e consultas:
{ "created": "936864000", "dir_name": "important_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": ".aws" }, { "name": "downloads" } ], "owner": "Amazon S3" } { "created": "936864000", "dir_name": "other_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": "my stuff" }, { "name": "backup" } ], "owner": "User" }
SELECT d.dir_name, d.files FROM S3Object[*] d
{"dir_name":"important_docs","files":[{"name":"."},{"name":".."},{"name":".aws"},{"name":"downloads"}]} {"dir_name":"other_docs","files":[{"name":"."},{"name":".."},{"name":"my stuff"},{"name":"backup"}]}
SELECT _1.dir_name, _1.owner FROM S3Object[*]
{"dir_name":"important_docs","owner":"Amazon S3"} {"dir_name":"other_docs","owner":"User"}
WHERECláusula
A cláusula WHERE
segue esta sintaxe:
WHERE
condition
A cláusula WHERE
filtra as linhas com base na
. Uma condição é uma expressão com um valor booliano. Somente linhas para as quais a condição é avaliada como condition
TRUE
são retornadas no resultado.
LIMITCláusula
A cláusula LIMIT
segue esta sintaxe:
LIMIT
number
A cláusula LIMIT
limita o número de registros que você deseja que a consulta retorne com base no
.number
Acesso ao atributo
As cláusulas SELECT
e WHERE
podem se referir a dados de registro usando um dos métodos nas seções a seguir, dependendo se o arquivo que está sendo consultado está no formato CSV ou JSON.
CSV
-
Números da coluna: você pode se referir à coluna Nth de uma linha com o nome da coluna
_
, em queN
é a posição da coluna. A contagem da posição começa em 1. Por exemplo, a primeira coluna é denominadaN
_1
e a segunda coluna é denominada_2
.Você pode se referir a uma coluna como
_
ouN
. Por exemplo,alias
._N
_2
emyAlias._2
são maneiras válidas de fazer referência a uma coluna na listaSELECT
e na cláusulaWHERE
. -
Cabeçalhos da coluna — Para objetos no formato CSV que possuem uma linha de cabeçalho, os cabeçalhos estão disponíveis para a lista
SELECT
e a cláusulaWHERE
. Especificamente, como no SQL tradicional, nas expressões de cláusulaSELECT
eWHERE
, você pode consultar as colunas por
oualias
.column_name
.column_name
JSON
-
Documento — você pode acessar os campos do documentos JSON como
. Também é possível acessar os campos aninhados, por exemplo,alias
.name
.alias
.name1
.name2
.name3
-
Lista: é possível acessar elementos em uma lista JSON usando índices baseados em zero com o operador
[]
. Por exemplo, você pode acessar o segundo elemento de uma lista como
. É possível combinar elementos da lista de acesso com campos, por exemplo,alias
[1]
.alias
.name1
.name2
[1].name3
-
Exemplos: considere esse objeto JSON como um exemplo de conjunto de dados:
{"name": "Susan Smith", "org": "engineering", "projects": [ {"project_name":"project1", "completed":false}, {"project_name":"project2", "completed":true} ] }
Exemplo 1
A consulta a seguir retorna estes resultados:
Select s.name from S3Object s
{"name":"Susan Smith"}
Exemplo 2
A consulta a seguir retorna estes resultados:
Select s.projects[0].project_name from S3Object s
{"project_name":"project1"}
Diferenciação de letras maiúsculas e minúsculas de cabeçalho e nomes de atributo
Com o Amazon S3 Select, você pode usar aspas duplas para indicar que cabeçalhos de coluna (para objetos CSV) e atributos (para objetos JSON) fazem diferenciação entre letras maiúsculas e minúsculas. Sem as aspas duplas, os cabeçalhos e atributos de objeto não diferenciam letras maiúsculas de minúsculas. Um erro ocorre em casos de ambiguidade.
Os exemplos a seguir são 1) objetos do Amazon S3 no formato CSV com os cabeçalhos de coluna especificados e com FileHeaderInfo
definido como "Use"
para a solicitação de consulta; ou 2) objetos do Amazon S3 no formato JSON com os atributos especificados.
Exemplo 1: o objeto consultado tem o cabeçalho ou atributo NAME
.
-
A expressão a seguir retorna com êxito valores do objeto. Como não há aspas, a consulta não diferencia letras maiúsculas de minúsculas.
SELECT s.name from S3Object s
-
A expressão a seguir resulta em um erro 400
MissingHeaderName
. Como há aspas, a consulta diferencia letras maiúsculas de minúsculas.SELECT s."name" from S3Object s
Exemplo 2: o objeto do Amazon S3 que está sendo consultado tem um cabeçalho ou atributo com NAME
e outro cabeçalho/atributo com name
.
-
A expressão a seguir resulta em um erro 400
AmbiguousFieldName
. Como não há aspas, a consulta não diferencia letras maiúsculas de minúsculas, mas há duas correspondências, então o erro é gerado.SELECT s.name from S3Object s
-
A expressão a seguir retorna com êxito valores do objeto. Como há aspas, a consulta diferencia letras maiúsculas de minúsculas, portanto, não há ambiguidade.
SELECT s."NAME" from S3Object s
Usar palavras-chave reservadas como termos definidos pelo usuário
O Amazon S3 Select possui um conjunto de palavras-chave reservadas que são necessárias para executar as expressões SQL usadas para consultar o conteúdo do objeto. As palavras-chave reservadas incluem nomes de função, tipos de dados, operadores, e assim por diante. Em alguns casos, os termos definidos pelo usuário como os cabeçalhos de coluna (para arquivos CSV) ou os atributos (para objetos JSON) podem entrar em conflito com uma palavra-chave reservada. Quando isso ocorrer, é necessário usar as aspas duplas para indicar que você está usando intencionalmente um termo definido pelo usuário que entra em conflito com uma palavra-chave reservada. Caso contrário, ocorrerá um erro de análise 400.
Para obter a lista completa de palavras-chave reservadas, consulte Palavras-chave reservadas.
O exemplo a seguir é 1) um objeto do Amazon S3 no formato CSV com os cabeçalhos de coluna especificados, com FileHeaderInfo
definido como "Use"
para a solicitação de consulta ou 2) um objeto do Amazon S3 no formato JSON com os atributos especificados.
Exemplo: o objeto consultado tem o cabeçalho ou atributo nomeado como CAST
, que é uma palavra-chave reservada.
-
A expressão a seguir retorna com êxito valores do objeto. Como as aspas são usadas na consulta, o S3 Select usa o cabeçalho ou atributo definido pelo usuário.
SELECT s."CAST" from S3Object s
-
A expressão a seguir resulta em um erro de análise 400. Como nenhuma aspa é usada na consulta,
CAST
colide com uma palavra-chave reservada.SELECT s.CAST from S3Object s
Expressões escalares
Na cláusula WHERE
e na lista SELECT
, você tem expressões escalares SQL, que são expressões que retornam valores escalares. Elas têm o seguinte formato:
-
literal
Um literal SQL.
-
column_reference
Uma referência a uma coluna no formulário
oucolumn_name
.alias
.column_name
-
unary_op
expression
Nesse caso,
é um operador unário SQL.unary_op
-
expression
binary_op
expression
Nesse caso,
é um operador binário SQL.binary_op
-
func_name
Nesse caso,
é o nome da função escalar a ser invocada.func_name
-
expression
[ NOT ] BETWEEN
expression
AND
expression
-
expression
LIKE
[expression
ESCAPE
]expression