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

Trình tạo câu truy vấn SQL

Ghép một truy vấn SQL từ các phần được cho theo bất kỳ thứ tự nào, giống như một đối tượng builder thu thập các thiết lập từng bước.

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

  • Gom các phần theo thứ tự bất kỳ trước khi tạo
  • Dùng giá trị mặc định cho phần bị thiếu
  • Ghép kết quả theo một định dạng cố định

Đề bài

Xem bản gốc (English)

Mẫu builder xây dựng một đối tượng phức tạp từng bước và tạo ra kết quả cuối cùng ở cuối cùng, vì vậy người gọi có thể đặt các phần theo bất kỳ thứ tự nào.

Mỗi phần là một từ khóa, một khoảng trắng, và nội dung của nó:

  • select <columns>: tên cột được phân tách bằng dấu phẩy (khoảng trắng quanh dấu phẩy có thể thay đổi). Không bắt buộc; giá trị mặc định là *.
  • from <table>: bắt buộc.
  • where <condition>, order <columns>, limit <n>: không bắt buộc.

Nếu một từ khóa xuất hiện hơn một lần, giá trị cuối cùng sẽ được dùng. Hãy xây dựng truy vấn theo thứ tự cố định này, với một khoảng trắng đơn:

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

Trong danh sách SELECT, hãy trim từng cột và nối chúng bằng , . Mọi văn bản khác được sao chép nguyên vẹn.

Cài đặt query_builder(parts).

Input

parts: Các phần, theo bất kỳ thứ tự nào.

Output

Trả về chuỗi truy vấn SQL.

Ràng buộc

1 ≤ số phần ≤ 20

Có ít nhất một phần from; mỗi phần có tối đa 100 ký tự

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

Các phần đến không theo thứ tự, nhưng truy vấn luôn được xây dựng theo dạng 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

Nếu không có phần select thì các cột mặc định là *: "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

Lưu từng phần theo từ khóa trước; chỉ tạo câu lệnh ở cuối.

Gợi ý 2

Phần đến sau có cùng từ khóa sẽ thay phần trước.

Gợi ý 3

Cắt khoảng trắng từng cột trong danh sách SELECT và dùng * khi không có phần select.

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

thời gian O(tổng độ dài), bộ nhớ phụ O(tổng độ dài)

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.