ปานกลาง 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

SQL Query Builder

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

สิ่งที่คุณจะได้เรียนรู้

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

โจทย์

ดูฉบับแปล

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.

เงื่อนไข

1 ≤ number of parts ≤ 20

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

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
parts = ["where age \u003e 18", "from users", "select name,age"]

ผลลัพธ์ที่คาดหวัง:
expected = "SELECT name, age FROM users WHERE age \u003e 18"
อินพุต:
std::vector<std::string> parts = {"where age \u003e 18", "from users", "select name,age"};

ผลลัพธ์ที่คาดหวัง:
std::string expected = "SELECT name, age FROM users WHERE age \u003e 18";
อินพุต:
string[] parts = new string[] {"where age \u003e 18", "from users", "select name,age"};

ผลลัพธ์ที่คาดหวัง:
string expected = "SELECT name, age FROM users WHERE age \u003e 18";

คำอธิบาย

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

ตัวอย่างที่ 2
อินพุต:
parts = ["from orders", "limit 10", "order total DESC"]

ผลลัพธ์ที่คาดหวัง:
expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10"
อินพุต:
std::vector<std::string> parts = {"from orders", "limit 10", "order total DESC"};

ผลลัพธ์ที่คาดหวัง:
std::string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";
อินพุต:
string[] parts = new string[] {"from orders", "limit 10", "order total DESC"};

ผลลัพธ์ที่คาดหวัง:
string expected = "SELECT * FROM orders ORDER BY total DESC LIMIT 10";

คำอธิบาย

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

แนวทางการแก้

ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ

คำใบ้ 1

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

คำใบ้ 2

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

คำใบ้ 3

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

ความซับซ้อนที่คาดหวัง

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

แหล่งอ้างอิง

โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก