Volver a los desafíos
Intermedio 0 resueltos 0% de aceptación

Constructor de consultas SQL

Ensambla una consulta SQL a partir de partes dadas en cualquier orden, como un objeto constructor que reúne configuraciones paso a paso.

Lo que aprenderás

  • Reunir partes en cualquier orden antes de construir
  • Usar valores por defecto para las partes que faltan
  • Ensamblar un resultado con un formato fijo

Problema

Ver original (inglés)

El patrón builder construye un objeto complejo paso a paso y produce el resultado final al final, de modo que quienes lo usan pueden establecer las partes en cualquier orden.

Cada parte es una palabra clave, un espacio y su texto:

  • select <columns>: nombres de columnas separados por comas (los espacios alrededor de las comas pueden variar). Opcional; el valor predeterminado es *.
  • from <table>: obligatorio.
  • where <condition>, order <columns>, limit <n>: opcionales.

Si una palabra clave aparece más de una vez, gana la última. Construye la consulta en este orden fijo, con espacios simples:

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

En la lista SELECT, recorta cada columna y únelas con , . Todos los demás textos se copian sin cambios.

Implementa query_builder(parts).

Entrada

parts: Las partes, en cualquier orden.

Salida

Devuelve la cadena de la consulta SQL.

Restricciones

1 ≤ número de partes ≤ 20

Al menos una parte from; cada parte tiene como máximo 100 caracteres

Ejemplos

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

Salida 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"};

Salida 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"};

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

Explicación

Las partes llegan desordenadas, pero la consulta siempre se construye como SELECT … FROM … WHERE …: "SELECT name, age FROM users WHERE age > 18".

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

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

Salida 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"};

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

Explicación

Sin parte select, las columnas son * por defecto: "SELECT * FROM orders ORDER BY total DESC LIMIT 10".

Cómo abordarlo

Inténtalo primero por tu cuenta y luego abre las pistas una a una.

Pista 1

Guarda primero cada parte por su palabra clave; construye el texto solo al final.

Pista 2

Una parte posterior con la misma palabra clave reemplaza a la anterior.

Pista 3

Quita espacios a cada columna de la lista SELECT y usa * si no hay parte select.

Complejidad esperada

tiempo O(longitud total), espacio extra O(longitud total)

Referencias

Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.

Aprende de otros

Soluciones de la comunidad

Aún no hay soluciones publicadas. Resuelve este reto para compartir la primera.