SELECTComando
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:
-
SELECTlista -
FROMCláusula -
WHERECláusula -
LIMITClá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 * SELECTprojection1AScolumn_alias_1,projection2AScolumn_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:
FROMtable_nameFROMtable_name aliasFROMtable_nameASalias
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 Amazon S3 Select, você também pode usar as seguintes formas da cláusula FROM:
FROM S3Object[*].pathFROM S3Object[*].path aliasFROM S3Object[*].pathASalias
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
FROMfunciona apenas com objetos JSON. -
Caracteres curingas sempre emitem pelo menos um registro. Se não houver correspondência com nenhum registro, o Amazon S3 Select emitirá o valor
MISSING. Durante a serialização de saída (após a execução da consulta), o Amazon S3 Select substituirá os valoresMISSINGpor 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_1para 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
FROMdeverá 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 S3ObjecteFROM S3Object[*].são clausulas válidas, maspathFROM S3Object.não.path
Examples:
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].idproduziu uma correspondência. -
{}:S3Object[0].Rules[1].idnã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].idproduziu 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 Amazon S3 Select 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:
WHEREcondition
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 conditionTRUE são retornadas no resultado.
LIMITCláusula
A cláusula LIMIT segue esta sintaxe:
LIMITnumber
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_1e a segunda coluna é denominada_2.Você pode se referir a uma coluna como
_ouN. Por exemplo,alias._N_2emyAlias._2são maneiras válidas de fazer referência a uma coluna na listaSELECTe 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
SELECTe a cláusulaWHERE. Especificamente, como no SQL tradicional, nas expressões de cláusulaSELECTeWHERE, você pode consultar as colunas poroualias.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,
CASTcolide 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:
-
literalUm literal SQL.
-
column_referenceUma referência a uma coluna no formulário
oucolumn_name.alias.column_name -
unary_opexpressionNesse caso,
é um operador unário SQL.unary_op -
expressionbinary_opexpressionNesse caso,
é um operador binário SQL.binary_op -
func_nameNesse caso,
é o nome da função escalar a ser invocada.func_name -
expression[ NOT ] BETWEENexpressionANDexpression -
expressionLIKE[expressionESCAPE]expression