フィルターからパラメーター化SQL WHERE句を作成
アプリケーションの構造化フィルター一覧を、データベースクライアントが必要とする2つの要素に変換します。位置パラメーター付きのSQL WHERE句と、順序を保った独立のパラメーター配列です。修飾名の各部分を含むすべてのフィールド名をSQL識別子として引用し、値はSQL本文に埋め込みません。フィルターは元の順序を維持してANDで結合されるため、クエリビルダー、管理ツール、レポート画面、フィルターをデータとして受け取るエンドポイントで予測可能な結果を得られます。
無料で実行
処理はブラウザ内で完結します。ファイルは送信されません。無料でご利用いただけます。
値を連結せずにSQL構造を組み立てます
動的な検索画面では、フィールド、演算子、値という一見安全なレコードから処理を始めることがよくあります。危険なのは、その値を文字列へ直接挿入してSQLに変換する段階です。このビルダーは構造とデータを分離します。$1や$2のようなPostgreSQL形式の位置パラメーターを含むパラメーター化SQL WHERE句と、完全に対応する順序のparams配列を返します。句をより大きなSELECT、UPDATE、DELETE文へ組み込み、paramsを互換性のあるデータベースドライバーへ渡してください。本機能はクエリを実行せず、データベースへ接続せず、スキーマを調査せず、呼び出し元が利用できる列も決定しません。利用者がフィールド名へ影響できる場合は、アプリケーション側で許可リストを維持する必要があります。識別子の引用は句読記号や予約語による構文破損を防ぎますが、認可はアプリケーションの責任です。フィルターを入力順にANDで結ぶため、出力は安定しており、記録、比較、固定クエリ接頭辞との結合も容易です。
演算子、パラメーター、NULL判定を理解します
等価、不等価、大小比較、LIKE、NOT LIKE、IN、NOT IN、IS NULL、IS NOT NULLを利用できます。演算子は大文字へ正規化され、連続する空白も1つにまとめられるため、「not like」のような入力から標準的なSQLが生成されます。通常の比較はそれぞれ1つのパラメーターを使用します。INとNOT INには空でない配列が必要であり、要素の順序を保ったまま、要素ごとに1つのプレースホルダーへ展開します。NULL判定演算子のSQL文法にはプレースホルダーがないため、値もパラメーターも不要です。それ以外の演算子で値が欠けている場合は、不完全なSQLを作らず入力エラーとして拒否します。文字列、数値、真偽値、nullを含むJSONスカラー値を使用でき、配列は2つのリスト演算子専用です。出力はPostgreSQLと対応ライブラリに適した番号付きドル形式を採用しています。ドライバーが疑問符や名前付きパラメーターを使う場合は、返された値の順序を維持したまま、管理されたアダプターで構文を変換してください。
識別子を引用し、アプリケーション方針を検証します
各フィールドは、修飾されている可能性がある識別子として扱います。users.created_atのような名前は2つの部分を個別に引用し、内部の二重引用符は標準SQL識別子規則に従って重ねてエスケープします。空の名前や、ドット間に空部分がある名前は拒否します。この処理により、フィールド文字列が引用されていないSQL構文として解釈されることを防げます。ただし、すべてのデータベースエンジンが同一の引用規則を持つという意味ではありません。特に二重引用符の規則に従わない製品では、対象データベースとの互換性をご確認ください。また、エスケープは権限付与ではありません。外部の呼び出し元がフィールドを選べる場合は、公開フィルターキーを明示的に許可した実列へマッピングしてからビルダーを呼び出してください。演算子にも業務ルールを適用し、たとえばレポート用エンドポイントでは等価と範囲だけを許可し、LIKE対応でもパターン検索を拒否できます。未対応のSQL演算子は、未知の構文を通さず明確な入力エラーになります。本機能は決定的に動作し、ネットワーク通信を行わず、句とパラメーターだけを返します。
活用例
APIエンドポイントのフィルターを処理します
検証済みのクエリ文字列フィルターを、データベース要求用の句と順序付きパラメーターへ変換します。
社内レポートクエリを構築します
レポートビルダーの行を、値をSQL本文へ挿入しないAND述語へ変換します。
テスト可能なリポジトリクエリを作成します
データアクセス層のテストで、決定的な句とパラメーター配列を別々にスナップショット化します。
よくある質問
料金はいくらですか?
APIリクエストは$0.002からです。対話的な用途にはブラウザー実行機能もご利用いただけます。
このツールはSQLを実行しますか?
いいえ。WHERE句と順序付きparams配列のみを返し、アプリケーションからデータベースドライバーへ渡します。
どのプレースホルダー構文を生成しますか?
PostgreSQL形式の番号付きプレースホルダー、つまり$1、$2などを生成します。
INとNOT INを使用できますか?
はい。空でない配列を値として指定すると、要素ごとにプレースホルダーを1つ作成します。
NULL判定はどのように表現しますか?
IS NULLまたはIS NOT NULLを使用します。値は不要で、paramsにも項目を追加しません。
識別子のエスケープで列の許可リストは不要になりますか?
いいえ。エスケープは構文を保護し、許可リストは呼び出し元が利用できる列や修飾名を決定します。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/dev2/sql-where-builder \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"filters":[{"field":"users.status","operator":"=","value":"active"},{"field":"users.age","operator":">=","value":21}]}'const res = await fetch("https://api.kit.forhosting.com/dev2/sql-where-builder", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"filters": [
{
"field": "users.status",
"operator": "=",
"value": "active"
},
{
"field": "users.age",
"operator": ">=",
"value": 21
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev2/sql-where-builder",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"filters": [
{
"field": "users.status",
"operator": "=",
"value": "active"
},
{
"field": "users.age",
"operator": ">=",
"value": 21
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev2/sql-where-builder", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"filters":[{"field":"users.status","operator":"=","value":"active"},{"field":"users.age","operator":">=","value":21}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"filters":[{"field":"users.status","operator":"=","value":"active"},{"field":"users.age","operator":">=","value":21}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev2/sql-where-builder", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"filters": [
{
"field": "users.status",
"operator": "=",
"value": "active"
},
{
"field": "users.age",
"operator": ">=",
"value": 21
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev2.sql_where_builder",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_items | 100 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |