Retour aux défis
Moyen 0 résolus 0 % de réussite

Constructeur de requêtes SQL

Assemblez une requête SQL à partir de morceaux donnés dans n’importe quel ordre, comme un objet constructeur qui rassemble les paramètres étape par étape.

Ce que vous allez apprendre

  • Rassembler les parties dans n'importe quel ordre avant de construire
  • Appliquer des valeurs par défaut aux parties manquantes
  • Assembler un résultat dans un format fixe

Problème

Le patron builder construit un objet complexe étape par étape et produit le résultat final à la fin, afin que les appelants puissent définir les parties dans n’importe quel ordre.

Chaque partie est un mot-clé, un espace, puis son texte :

  • select <columns> : noms de colonnes séparés par des virgules (les espaces autour des virgules peuvent varier). Facultatif ; la valeur par défaut est *.
  • from <table> : obligatoire.
  • where <condition>, order <columns>, limit <n> : facultatifs.

Si un mot-clé apparaît plus d’une fois, seul le dernier compte. Construisez la requête dans cet ordre fixe, avec des espaces simples :

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

Dans la liste SELECT, supprimez les espaces de chaque colonne et joignez-les avec , . Tous les autres textes sont copiés sans modification.

Implémentez query_builder(parts).

Entrée

parts: Les parties, dans n’importe quel ordre.

Sortie

Retournez la chaîne de requête SQL.

Contraintes

1 ≤ nombre de parties ≤ 20

Au moins une partie from ; chaque partie a au plus 100 caractères

Exemples

Exemple 1
Entrée :
parts = ["where age \u003e 18", "from users", "select name,age"]

Sortie attendue :
expected = "SELECT name, age FROM users WHERE age \u003e 18"
Entrée :
std::vector<std::string> parts = {"where age \u003e 18", "from users", "select name,age"};

Sortie attendue :
std::string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Entrée :
string[] parts = new string[] {"where age \u003e 18", "from users", "select name,age"};

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

Explication

Les parties arrivent dans le désordre, mais la requête est toujours construite comme SELECT … FROM … WHERE … : "SELECT name, age FROM users WHERE age > 18".

Exemple 2
Entrée :
parts = ["from orders", "limit 10", "order total DESC"]

Sortie attendue :
expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10"
Entrée :
std::vector<std::string> parts = {"from orders", "limit 10", "order total DESC"};

Sortie attendue :
std::string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Entrée :
string[] parts = new string[] {"from orders", "limit 10", "order total DESC"};

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

Explication

Sans partie select, les colonnes prennent la valeur par défaut * : "SELECT * FROM orders ORDER BY total DESC LIMIT 10".

Comment l'aborder

Essayez d'abord seul, puis ouvrez les indices un par un.

Indice 1

Stockez d'abord chaque partie selon son mot-clé ; construisez le texte seulement à la fin.

Indice 2

Une partie plus tardive avec le même mot-clé remplace la précédente.

Indice 3

Retirez les espaces de chaque colonne de la liste SELECT et utilisez * sans partie select.

Complexité attendue

temps O(longueur totale), espace supplémentaire O(longueur totale)

Références

Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.

Apprenez des autres

Solutions de la communauté

Aucune solution publiée pour l'instant. Résolvez ce défi pour partager la première.