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

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.

Banner da Escola de Data Science: Matricula-se na escola de Data Science. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!

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

Co-fundador da Alura, da Caelum e do GUJ. Com 18 anos de ensino nas áreas de programação e dados, criou mais de 100 cursos. Possui formação em engenharia de software, viés matemático e criativo, além de ser medalhista de ouro em competições nacionais de computação, tendo representado o Brasil nos mundiais. Participante de comunidades open source e de educação em tecnologia, tendo escrito 7 livros. Faz mágica e fala coreano no tempo livre.

Veja outros artigos sobre Data Science