Torna alle sfide
Media 0 risolte 0% di accettazione

Costruttore di query SQL

Assembla una query SQL a partire da parti date in qualsiasi ordine, come fa un oggetto builder che raccoglie le impostazioni passo dopo passo.

Cosa imparerai

  • Raccogliere le parti in qualsiasi ordine prima di costruire
  • Usare valori predefiniti per le parti mancanti
  • Comporre un risultato in un formato fisso

Problema

Il pattern builder costruisce un oggetto complesso passo dopo passo e produce il risultato finale alla fine, così chi chiama può impostare le parti in qualsiasi ordine.

Ogni parte è una parola chiave, uno spazio e il suo testo:

  • select <columns>: nomi di colonna separati da virgole (gli spazi attorno alle virgole possono variare). Facoltativo; il valore predefinito è *.
  • from <table>: obbligatorio.
  • where <condition>, order <columns>, limit <n>: facoltativi.

Se una parola chiave appare più di una volta, vince l’ultima. Costruisci la query in questo ordine fisso, con spazi singoli:

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

Nella lista SELECT, rimuovi gli spazi iniziali e finali da ogni colonna e uniscile con , . Tutti gli altri testi vengono copiati senza modifiche.

Implementa query_builder(parts).

Input

parts: Le parti, in qualsiasi ordine.

Output

Restituisci la stringa della query SQL.

Vincoli

1 ≤ numero di parti ≤ 20

Almeno una parte from; ogni parte ha al massimo 100 caratteri

Esempi

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

Output atteso:
expected = "SELECT name, age FROM users WHERE age \u003e 18"
Input:
std::vector<std::string> parts = {"where age \u003e 18", "from users", "select name,age"};

Output atteso:
std::string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Input:
string[] parts = new string[] {"where age \u003e 18", "from users", "select name,age"};

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

Spiegazione

Le parti arrivano fuori ordine, ma la query viene sempre costruita come SELECT … FROM … WHERE …: "SELECT name, age FROM users WHERE age > 18".

Esempio 2
Input:
parts = ["from orders", "limit 10", "order total DESC"]

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

Output atteso:
std::string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Input:
string[] parts = new string[] {"from orders", "limit 10", "order total DESC"};

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

Spiegazione

Senza una parte select, le colonne predefinite sono *: "SELECT * FROM orders ORDER BY total DESC LIMIT 10".

Come affrontarlo

Prova prima da solo, poi apri un suggerimento alla volta.

Suggerimento 1

Salva prima ogni parte in base alla sua parola chiave; costruisci il testo solo alla fine.

Suggerimento 2

Una parte successiva con la stessa parola chiave sostituisce quella precedente.

Suggerimento 3

Togli gli spazi da ogni colonna della lista SELECT e usa * se non c'è la parte select.

Complessità attesa

tempo O(lunghezza totale), spazio aggiuntivo O(lunghezza totale)

Riferimenti

Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.

Impara dagli altri

Soluzioni della community

Nessuna soluzione pubblicata. Risolvi questa sfida per condividere la prima.