Voltar para os desafios
Médio 0 resolvidos 0% de aceitação

Construtor de consultas SQL

Monte uma consulta SQL a partir de partes fornecidas em qualquer ordem, do mesmo jeito que um objeto builder coleta configurações passo a passo.

O que você vai aprender

  • Reunir partes em qualquer ordem antes de montar
  • Usar valores padrão para partes que faltam
  • Montar um resultado em formato fixo

Problema

Ver original (inglês)

O padrão builder constrói um objeto complexo passo a passo e produz o resultado final no fim, para que quem chama possa definir as partes em qualquer ordem.

Cada parte é uma palavra-chave, um espaço e seu texto:

  • select <columns>: nomes de colunas separados por vírgula (os espaços ao redor das vírgulas podem variar). Opcional; o padrão é *.
  • from <table>: obrigatório.
  • where <condition>, order <columns>, limit <n>: opcionais.

Se uma palavra-chave aparecer mais de uma vez, a última vence. Monte a consulta nesta ordem fixa, com espaços simples:

SELECT <columns> FROM <table>[ WHERE <condition>][ ORDER BY <columns>][ LIMIT <n>]

Na lista SELECT, remova os espaços de cada coluna e junte-as com , . Todos os outros textos são copiados sem שינוי.

Implemente query_builder(parts).

Input

parts: As partes, em qualquer ordem.

Output

Retorne a string da consulta SQL.

Restrições

1 ≤ número de partes ≤ 20

Pelo menos uma parte from; cada parte tem no máximo 100 caracteres

Exemplos

Exemplo 1
Entrada:
parts = ["where age \u003e 18", "from users", "select name,age"]

Saída esperada:
expected = "SELECT name, age FROM users WHERE age \u003e 18"
Entrada:
std::vector<std::string> parts = {"where age \u003e 18", "from users", "select name,age"};

Saída esperada:
std::string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Entrada:
string[] parts = new string[] {"where age \u003e 18", "from users", "select name,age"};

Saída esperada:
string expected = "SELECT name, age FROM users WHERE age \u003e 18";

Explicação

As partes chegam fora de ordem, mas a consulta é sempre montada como SELECT … FROM … WHERE …: "SELECT name, age FROM users WHERE age > 18".

Exemplo 2
Entrada:
parts = ["from orders", "limit 10", "order total DESC"]

Saída esperada:
expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10"
Entrada:
std::vector<std::string> parts = {"from orders", "limit 10", "order total DESC"};

Saída esperada:
std::string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Entrada:
string[] parts = new string[] {"from orders", "limit 10", "order total DESC"};

Saída esperada:
string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";

Explicação

Sem uma parte select, as colunas têm padrão *: "SELECT * FROM orders ORDER BY total DESC LIMIT 10".

Como abordar

Tente sozinho primeiro e depois abra uma dica de cada vez.

Dica 1

Guarde primeiro cada parte pela palavra-chave; monte o texto só no final.

Dica 2

Uma parte posterior com a mesma palavra-chave substitui a anterior.

Dica 3

Remova os espaços de cada coluna da lista SELECT e use * se não houver parte select.

Complexidade esperada

tempo O(comprimento total), espaço extra O(comprimento total)

Referências

Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.

Aprenda com outros

Soluções da comunidade

Ainda não há soluções publicadas. Resolva este desafio para compartilhar a primeira.