Crie uma cláusula WHERE SQL parametrizada com filtros
Transforme uma lista estruturada de filtros da aplicação nas duas partes exigidas por um cliente de banco de dados: uma cláusula WHERE SQL com placeholders posicionais e um array separado de parâmetros ordenados.
Executar grátis
Roda direto no seu navegador. Grátis, sem cadastro — seus dados não são enviados para lugar nenhum.
Cada nome de campo recebe aspas de identificador SQL, inclusive cada segmento de um nome qualificado, enquanto os valores ficam fora do texto SQL. Os filtros mantêm a ordem original e são unidos por AND, tornando o resultado previsível para construtores de consultas, ferramentas administrativas, telas de relatórios e endpoints que já recebem filtros como dados.
Monte a estrutura SQL sem concatenar valores
Telas de pesquisa dinâmica normalmente começam com registros que parecem inofensivos: um campo, um operador e um valor. O risco surge ao transformar esses registros em SQL inserindo o valor diretamente em uma string. Este construtor mantém estrutura e dados separados. Ele retorna uma cláusula WHERE SQL parametrizada com placeholders posicionais no estilo PostgreSQL, como $1 e $2, além de um array params exatamente na ordem correspondente. Acrescente a cláusula a uma instrução SELECT, UPDATE ou DELETE maior e forneça params a um driver compatível. O construtor não executa consultas, não se conecta ao banco, não inspeciona esquemas nem decide quais colunas podem ser usadas. Sua aplicação ainda deve manter uma lista de permissão quando usuários puderem influenciar os campos. As aspas impedem que pontuação e palavras reservadas quebrem a sintaxe, mas a autorização continua sob responsabilidade da aplicação. Como os filtros são unidos por AND na ordem recebida, a saída é estável e simples de registrar, comparar ou combinar com um prefixo fixo de consulta.
Entenda operadores, placeholders e verificações de nulo
São aceitos operadores de igualdade, desigualdade, comparação de ordem, LIKE, NOT LIKE, IN, NOT IN, IS NULL e IS NOT NULL. O texto do operador é normalizado em maiúsculas e espaços repetidos são reduzidos, portanto uma forma como “not like” produz SQL canônico. Cada comparação comum consome um parâmetro. IN e NOT IN exigem um array não vazio e o expandem em um placeholder por elemento, preservando a ordem. Operadores de nulo não consomem parâmetros nem exigem valor, pois sua gramática SQL não contém placeholder. A ausência de valor em qualquer outro operador é rejeitada em vez de gerar SQL incompleto. Valores escalares JSON são aceitos, incluindo strings, números, booleanos e null; arrays ficam reservados aos dois operadores de lista. O resultado usa intencionalmente placeholders numerados com cifrão, adequados ao PostgreSQL e a bibliotecas compatíveis. Caso seu driver utilize pontos de interrogação ou parâmetros nomeados, adapte a sintaxe de modo controlado sem alterar a ordem retornada dos parâmetros.
Coloque identificadores entre aspas e valide a política
Cada campo é tratado como um identificador possivelmente qualificado. Um nome como users.created_at vira dois segmentos com aspas independentes, enquanto uma aspa dupla interna é escapada por duplicação conforme as regras padrão de identificadores SQL. Nomes vazios e segmentos vazios separados por pontos são rejeitados. Esse tratamento evita que uma string de campo seja confundida com sintaxe SQL sem aspas, mas não pressupõe que todos os bancos tenham regras idênticas. Confirme a compatibilidade com o banco de destino, principalmente se ele não adotar identificadores entre aspas duplas. Além disso, escapar não equivale a autorizar. Se uma pessoa externa puder escolher campos, mapeie as chaves públicas para um conjunto explícito de colunas reais antes de chamar o construtor. Faça o mesmo com operadores em nível de negócio: um endpoint de relatórios pode permitir igualdade e intervalos, porém negar padrões mesmo com suporte a LIKE. Qualquer operador SQL desconhecido gera um erro de entrada claro em vez de repassar sintaxe imprevista. A capacidade é determinística, não faz solicitações de rede e retorna somente a cláusula e os parâmetros.
Casos de uso
Implemente filtros em um endpoint de API
Converta filtros validados da query string em uma cláusula e parâmetros ordenados para uma solicitação ao banco.
Monte uma consulta interna de relatório
Transforme linhas do construtor de relatórios em predicados AND sem inserir valores no texto SQL.
Gere consultas de repositório testáveis
Registre separadamente a cláusula determinística e o array de parâmetros ao testar a camada de acesso a dados.
Perguntas frequentes
Quanto custa?
Cada solicitação de API começa em US$ 0,002. O executor no navegador está disponível para uso interativo.
Esta ferramenta executa o SQL?
Não. Ela apenas retorna uma cláusula WHERE e um array params ordenado; sua aplicação fornece ambos ao driver do banco.
Qual sintaxe de placeholder é gerada?
São gerados placeholders numerados no estilo PostgreSQL: $1, $2 e assim por diante.
Posso usar IN e NOT IN?
Sim. Forneça um array não vazio como valor, e o construtor criará um placeholder para cada elemento.
Como as verificações de nulo são representadas?
Use IS NULL ou IS NOT NULL. Esses operadores não exigem valor e não acrescentam itens a params.
Escapar identificadores substitui uma lista de colunas permitidas?
Não. O escape protege a sintaxe; a lista permitida determina quais colunas e nomes qualificados podem ser filtrados.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
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)Exemplo de requisição
{
"filters": [
{
"field": "users.status",
"operator": "=",
"value": "active"
},
{
"field": "users.age",
"operator": ">=",
"value": 21
}
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev2.sql_where_builder",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_items | 100 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |