SELECT command - Amazon Simple Storage Service

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

  • 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 * SELECT projection1 AS column_alias_1, projection2 AS column_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 projection1 e projection2 para cada coluna.

FROMCláusula

O Amazon S3 Select oferece suporte aos seguintes formatos de cláusula FROM:

FROM table_name FROM table_name alias FROM table_name AS alias

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 AS alias

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): .name ou ['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 valores MISSING por registros vazios.

  • Funções agregadas (AVG, COUNT, MAX, MIN, and SUM) ignoram valores MISSING.

  • 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 de SELECT price FROM S3Object[*].books[*].price, você pode usar a consulta SELECT _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 com S3Object[*]. 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 completa FROM S3Object é equivalente a FROM S3Object[*] as S3Object. Se você incluir um caminho, também deverá usar o caractere curinga. Portanto, FROM S3Object e FROM S3Object[*].path são clausulas válidas, mas FROM S3Object.path não.

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 emitiu MISSING, 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 em Rules. Portanto, o Amazon S3 Select emitiu MISSING, 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 condition. Uma condição é uma expressão com um valor booliano. Somente linhas para as quais a condição é avaliada como 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 _N, em que N é a posição da coluna. A contagem da posição começa em 1. Por exemplo, a primeira coluna é denominada _1 e a segunda coluna é denominada _2.

    Você pode se referir a uma coluna como _N ou alias._N. Por exemplo, _2 e myAlias._2 são maneiras válidas de fazer referência a uma coluna na lista SELECT e na cláusula WHERE.

  • 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áusula WHERE. Especificamente, como no SQL tradicional, nas expressões de cláusula SELECT e WHERE, você pode consultar as colunas por alias.column_name ou column_name.

JSON

  • Documento — você pode acessar os campos do documentos JSON como alias.name. Também é possível acessar os campos aninhados, por exemplo, 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 alias[1]. É possível combinar elementos da lista de acesso com campos, por exemplo, 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 column_name ou alias.column_name.

  • unary_op expression

    Nesse caso, unary_op é um operador unário SQL.

  • expression binary_op expression

    Nesse caso, binary_op é um operador binário SQL.

  • func_name

    Nesse caso, func_name é o nome da função escalar a ser invocada.

  • expression [ NOT ] BETWEEN expression AND expression

  • expression LIKE expression [ ESCAPE expression ]