Trung bình 0 đã giải Tỷ lệ chấp nhận 0%

SQL Query Builder

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

Bạn sẽ học được gì

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

Đề bài

Xem bản dịch

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.

Ràng buộc

1 ≤ number of parts ≤ 20

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

Ví dụ

Ví dụ 1
Đầu vào:
parts = ["where age \u003e 18", "from users", "select name,age"]

Kết quả mong đợi:
expected = "SELECT name, age FROM users WHERE age \u003e 18"
Đầu vào:
std::vector<std::string> parts = {"where age \u003e 18", "from users", "select name,age"};

Kết quả mong đợi:
std::string expected = "SELECT name, age FROM users WHERE age \u003e 18";
Đầu vào:
string[] parts = new string[] {"where age \u003e 18", "from users", "select name,age"};

Kết quả mong đợi:
string expected = "SELECT name, age FROM users WHERE age \u003e 18";

Giải thích

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

Ví dụ 2
Đầu vào:
parts = ["from orders", "limit 10", "order total DESC"]

Kết quả mong đợi:
expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10"
Đầu vào:
std::vector<std::string> parts = {"from orders", "limit 10", "order total DESC"};

Kết quả mong đợi:
std::string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
Đầu vào:
string[] parts = new string[] {"from orders", "limit 10", "order total DESC"};

Kết quả mong đợi:
string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";

Giải thích

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

Hướng tiếp cận

Hãy tự thử trước, sau đó mở từng gợi ý một.

Gợi ý 1

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

Gợi ý 2

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

Gợi ý 3

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

Độ phức tạp mong đợi

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

Tham khảo

Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.