Quando 1 não é 1 no SQL? Queries criadas dinamicamente

Guilherme Silveira
Guilherme Silveira

Compartilhe

Esses dias me deparei com o seguinte select quando tentavam buscar um livro pelo nome e ano de lançamento:


select * from Produtos p where 1=1 and p.nome like '%Java%' and p.ano = 2015;

Por que há um 1=1dentro de um where? Podemos tirar esse true daí, já que é equivalente? Claro! Ele é totalmente desnecessário em nosso SQL.

Mas por que escreveram isso? Se olharmos o código que gerou essa query, teremos a resposta:


query = "select * from Produtos p ";
query += "where 1=1 ";

if(nome != "") { 
    query += "and nome like '%" + nome + "%'";
}

if(ano != "") {
     query += "and ano = " + ano;
} 

O que eu fiz? Se preencheu o campo nome, adiciona ele na query:


if(nome != "") {
     query += "and nome like '%" + nome + "%'";
}

Se preencheu o campo ano, adiciona ele na busca:


if(ano != "") { query += "and ano = " + ano; }

Isto é, nosso formulário de busca permite que o usuário final preencha os campos que bem entender. Se ele não preenche nenhum, funciona, se preenche qualquer um funciona, se preenche ambos, funciona.

Ao colocar o where 1=1 fazemos com que cada parte opcional da nossa query use sempre um and, e fica fácil de escrever o código.

Por isso é comum ver algumas queries rodando com o where 1=1: são queries dinamicas onde o programador desejou fazer uma sequência de ands e ficar de boa na hora de concatená-los!

Consegue imaginar outras variações de como implementar esse código sem fazer where 1=1? Sem ifs extras?

Queria aproveitar para indicar o curso do meu amigo e professor comigo na Alura, o Maurício Aniche:

No MySQL I: Iniciando suas consultas passamos por diversos pepinos do dia a dia ao usar um banco de dados relacional, resolvendo nossos problemas com o MySQL.

Guilherme Silveira
Guilherme Silveira

Guilherme co-fundou a Caelum, a Alura e o GUJ. Com mais de 15 anos de experiência no ensino de programação e habilidades digitais, coordena as equipes de produção de cursos na Alura. É tecnólogo com viés matemático e medalhista de ouro em competições nacionais de computação, representando o Brasil nos mundiais. Participante ativo da comunidade open source e de educação em tecnologia, autor de 7 livros da área.

Veja outros artigos sobre Data Science