Quando 1 não é 1 no SQL?

(Last Updated On: 24 de Janeiro de 2017)

De repente deparo com a query sendo rodada no meu código de programação, quando tento 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;

Que porcaria é essa? 1=1? Claro que 1=1, podemos tirar esse cara daí por favor?

Claro! Ele é totalmente desnecessário em nosso SQL, mas se olharmos o código que gerou essa query:

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 preenche nenhum, funciona, se preenche qualquer um funciona, se preenche ambos, funciona.

Poderíamos fazer o mesmo código sem o 1=1:

query = "select * from Produtos p "
e = "where"

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

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

Mas repare que o código acima precisa de uma variável extra, ou precisaria de uns ifs a mais, ou qualquer outra complicação.

Ao colocar o where 1=1 fazemos com que cada parte opcional da nossa query use sempre um and, e fica facinho 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.

FIQUE POR DENTRO

Tech Education Leader no Alura

Próximo Artigo6 dicas de marketing pessoal para o profissional de tecnologia