Mittel 0 gelöst 0% Erfolgsquote

SQL-Query-Builder

Setze aus Teilen, die in beliebiger Reihenfolge gegeben sind, eine SQL-Abfrage zusammen – so, wie ein Builder-Objekt seine Einstellungen Schritt für Schritt sammelt.

Das lernst du

  • Teile in beliebiger Reihenfolge sammeln und erst dann bauen
  • Für fehlende Teile Standardwerte nutzen
  • Ein Ergebnis in festem Format zusammensetzen

Problem

Das builder-Muster konstruiert Schritt für Schritt ein komplexes Objekt und liefert am Ende das Ergebnis, sodass Aufrufer die Teile in beliebiger Reihenfolge setzen können.

Jeder Teil ist ein Schlüsselwort, ein Leerzeichen und sein Text:

  • select <columns>: durch Kommas getrennte Spaltennamen (Leerzeichen um die Kommas können variieren). Optional; der Standard ist *.
  • from <table>: erforderlich.
  • where <condition>, order <columns>, limit <n>: optional.

Wenn ein Schlüsselwort mehr als einmal vorkommt, zählt das letzte. Baue die Abfrage in dieser festen Reihenfolge mit einzelnen Leerzeichen:

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

In der SELECT-Liste trimme jede Spalte und verbinde sie mit , . Alle anderen Texte werden unverändert kopiert.

Implementiere query_builder(parts).

Eingabe

parts: Die Teile, in beliebiger Reihenfolge.

Ausgabe

Gib den SQL-Abfragestring zurück.

Einschränkungen

1 ≤ Anzahl der Teile ≤ 20

Mindestens ein from-Teil; jeder Teil hat höchstens 100 Zeichen

Beispiele

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

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

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

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

Erläuterung

Die Teile kommen in anderer Reihenfolge an, aber die Abfrage wird immer als SELECT … FROM … WHERE … aufgebaut: "SELECT name, age FROM users WHERE age > 18".

Beispiel 2
Eingabe:
parts = ["from orders", "limit 10", "order total DESC"]

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

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

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

Erläuterung

Ohne einen select-Teil sind die Spalten standardmäßig *: "SELECT * FROM orders ORDER BY total DESC LIMIT 10".

So gehst du vor

Versuch es zuerst allein und öffne dann einen Hinweis nach dem anderen.

Hinweis 1

Speichere jeden Teil zuerst unter seinem Schlüsselwort; baue den Text erst am Ende.

Hinweis 2

Ein späterer Teil mit demselben Schlüsselwort ersetzt den früheren.

Hinweis 3

Trimme jede Spalte in der SELECT-Liste und nimm *, wenn es keinen select-Teil gibt.

Erwartete Komplexität

Zeit O(Gesamtlänge), zusätzlicher Speicher O(Gesamtlänge)

Referenzen

Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.

Von anderen lernen

Community-Lösungen

Noch keine veröffentlichten Lösungen. Löse die Aufgabe und teile als Erster eine Lösung.