Quando 1 não é 1 no SQL? Queries criadas dinamicamente
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=1
dentro 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.