中級 0件解決済み 正答率0%

SQL クエリビルダー

任意の順序で与えられた部品から SQL クエリを組み立てる。ビルダーオブジェクトが設定を少しずつ集めるようなもの。

このチャレンジで学べること

  • 部品を順不同で集めてから組み立てる
  • 足りない部品には既定値を使う
  • 決まった形式で結果を組み立てる

問題

原文(英語)を表示

builder パターンは、複雑なオブジェクトを少しずつ構築し、最後に最終結果を生成するので、呼び出し側は各部分を任意の順序で設定できます。

各部分は、キーワード、スペース、その内容からなります。

  • select <columns>: カンマ区切りの列名(カンマの前後のスペースは異なっていてもよい)。省略可能。デフォルトは *。
  • from <table>: 必須。
  • where <condition>, order <columns>, limit <n>: 省略可能。

同じキーワードが複数回現れた場合は、最後のものが有効です。次の固定順で、単一のスペースを使ってクエリを構築してください。

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

SELECT のリストでは、各列の前後の空白を取り除き、, で結合します。それ以外のテキストはそのままコピーします。

query_builder(parts) を実装してください。

Input

parts: 順不同で与えられる部品。

Output

SQL クエリ文字列を返してください。

制約

1 ≤ パーツの数 ≤ 20

from パーツが少なくとも 1 つある。各パーツは 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 つずつ開いてみましょう。

ヒント 1

まず部品をキーワードごとに保存し、文字列は最後に組み立てます。

ヒント 2

同じキーワードの部品が後から来たら、前のものを置き換えます。

ヒント 3

SELECT の各列は空白を取り除き、select 部品がなければ * を使います。

目安の計算量

時間 O(合計の長さ)、追加メモリ O(合計の長さ)

参考資料

この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。

他の人の解答から学ぶ

コミュニティの解答

まだ公開された解答がありません。この課題を解いて最初の解答を共有しましょう。