All challenges
Medium 0 solved 0% acceptance

SQL Query Builder

Assemble a SQL query from parts given in any order, the way a builder object collects settings step by step.

What you'll learn

  • Collect parts in any order before building
  • Apply defaults for missing parts
  • Assemble a result in a fixed format

Problem

The builder pattern constructs a complex object step by step and produces the final result at the end, so callers can set the parts in any order.

Each part is a keyword, a space, and its text:

  • select <columns>: comma-separated column names (spaces around commas may vary). Optional; the default is *.
  • from <table>: required.
  • where <condition>, order <columns>, limit <n>: optional.

If a keyword appears more than once, the last one wins. Build the query in this fixed order, with single spaces:

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

In the SELECT list, trim each column and join them with , . All other texts are copied unchanged.

Implement query_builder(parts).

Input

parts: The parts, in any order.

Output

Return the SQL query string.

Constraints

1 ≤ number of parts ≤ 20

At least one from part; each part has at most 100 characters

Examples

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

Expected output:
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"};

Expected output:
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"};

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

Explanation

The parts arrive out of order, but the query is always built as SELECT … FROM … WHERE …: "SELECT name, age FROM users WHERE age > 18".

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

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

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

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

Explanation

Without a select part the columns default to *: "SELECT * FROM orders ORDER BY total DESC LIMIT 10".

How to approach it

Try on your own first, then open one hint at a time.

Hint 1

Store each part by its keyword first; build the text only at the end.

Hint 2

A later part with the same keyword replaces the earlier one.

Hint 3

Trim each column in the SELECT list and use * when there is no select part.

Expected complexity

O(total length) time, O(total length) extra space

References

This challenge is adapted for CodeUtility. Follow the statement and constraints above.

Learn from others

Community solutions

No published solutions yet. Solve this challenge to share the first one.