กลับไปยังโจทย์
ปานกลาง 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

ตัวสร้างคำสั่ง SQL

ประกอบคำสั่ง SQL จากส่วนต่าง ๆ ที่ให้มาได้ในลำดับใดก็ได้ เหมือนวัตถุแบบ builder ที่ค่อย ๆ เก็บการตั้งค่าทีละขั้น

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

  • รวบรวมส่วนต่าง ๆ ในลำดับใดก็ได้ก่อนสร้าง
  • ใช้ค่าเริ่มต้นกับส่วนที่ขาด
  • ประกอบผลลัพธ์ในรูปแบบตายตัว

โจทย์

แพตเทิร์น builder ใช้สร้างวัตถุที่ซับซ้อนทีละขั้น และให้ผลลัพธ์สุดท้ายเมื่อจบขั้นตอน ดังนั้นผู้เรียกจึงสามารถกำหนดส่วนต่าง ๆ ได้ในลำดับใดก็ได้

แต่ละส่วนเป็นคีย์เวิร์ด เว้นวรรคหนึ่งตัว และข้อความของมัน:

  • select <columns>: รายชื่อคอลัมน์คั่นด้วยจุลภาค (ช่องว่างรอบจุลภาคอาจแตกต่างกันได้) เป็นตัวเลือก; ค่าเริ่มต้นคือ *.
  • from <table>: จำเป็นต้องมี.
  • where <condition>, order <columns>, limit <n>: เป็นตัวเลือก.

ถ้ามีคีย์เวิร์ดใดปรากฏมากกว่าหนึ่งครั้ง ค่าอันล่าสุดจะถูกใช้ สร้าง query ตามลำดับคงที่นี้ โดยใช้ช่องว่างเดี่ยว:

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

ในรายการ SELECT ให้ตัดช่องว่างของแต่ละคอลัมน์ และนำมารวมกันด้วย , . ข้อความอื่นทั้งหมดให้คัดลอกโดยไม่เปลี่ยนแปลง

Implement query_builder(parts).

ข้อมูลนำเข้า

parts: The parts, in any order.

ผลลัพธ์

Return the SQL query string.

เงื่อนไข

1 ≤ จำนวนส่วน ≤ 20

มีส่วน from อย่างน้อยหนึ่งส่วน แต่ละส่วนยาวไม่เกิน 100 อักขระ

ตัวอย่าง

ตัวอย่างที่ 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";

คำอธิบาย

ส่วนต่าง ๆ มาไม่เรียงลำดับ แต่คำสั่งจะสร้างเป็น 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";

คำอธิบาย

เมื่อไม่มีส่วน select คอลัมน์จะเป็น * โดยปริยาย: "SELECT * FROM orders ORDER BY total DESC LIMIT 10"

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

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

คำใบ้ 1

เก็บแต่ละส่วนตามคีย์เวิร์ดก่อน แล้วค่อยสร้างข้อความตอนท้าย

คำใบ้ 2

ส่วนที่มาทีหลังซึ่งมีคีย์เวิร์ดเดียวกันจะแทนที่ส่วนก่อน

คำใบ้ 3

ตัดช่องว่างของแต่ละคอลัมน์ใน SELECT และใช้ * เมื่อไม่มีส่วน select

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

เวลา O(ความยาวรวม), หน่วยความจำเพิ่ม O(ความยาวรวม)

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

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

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

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

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