Instrução SQL: WHERE + 1 entenda como funciona

Compartilhe:

A verdade da questão é que a cláusula WHERE 1=1 é meramente uma convenção adotada por alguns desenvolvedores para tornar o trabalho com suas instruções SQL um pouco mais fácil, tanto na forma estática quanto dinâmica.

VAI GOSTAR:

21 comandos SQL essenciais e avançados e conteúdos extras

Melhores práticas em modelagem de banco de dados e SQL

SQL – Diferenças entre Not IN e Not EXISTS

Abre em nova aba

Também é uma prática comum ao criar uma consulta SQL programaticamente. É mais fácil começar com ‘WHERE 1=1 ‘e,em seguida,acrescentar outros critérios,como ‘AND customer.id=:custId’,dependendo se um ID de cliente é ou não fornecido. Isso permite que o desenvolvedor acrescente o próximo critério na consulta começando com ‘AND…’. Aqui está um exemplo hipotético:

stmt="SELECT * "
stmt+="FROM TABLE "
stmt+="WHERE 1=1 "
if user chooses option a then stmt+="and A is not null "
if user chooses option b then stmt+="and B is not null "
if user chooses option b then stmt+="and C is not null "
if user chooses option b then stmt+="and D is not null "

Pontos interessantes a serem levantados para esta solução com WHERE 1=1.

Clareza de código

Uma vantagem desta técnica é que o código acaba ficando mais limpo,pois assim não precisa existir o controle da presença do WHEREvs AND/OR,mantendo independente a ordem dos filtros que vão entrar na consulta e se algum filtro vai entrar na consulta.

Impacto na performance

Existe uma dúvida recorrente com relação ao impacto de performanceno banco de dados da presença do WHERE 1=1,independente se há outros filtros ou não. O que posso dizer que a maioria dos bancos de dadosnão sofre qualquer impacto de performance ao utilizar esta técnica.

Fazendo uma análise de impacto na plano de execução do Sql Server,com 10.000 registros em uma tabela,não notou-se qualquer mudança entre o plano contendo WHERE 1=1e do plano sem o mesmo.

Outra opção

Alguns bancos de dadossuportam também WHERE 1,embora esta não seja a opção recomendada por não fazer parte do padrão ANSI.

 

Exemplos de uso de WHERE+1

Quando as condições do where são geradas dinamicamente,e o programador vai acrescentando-as com ANDdentro de ifs,por estas dependerem de outros fatores do programa que gera o SQL,fica clara sua intenção:Se nao houver condição adicional,a query permanece assim …

SELECT*FROMDestinatario where1=1

…mas no caso,se for verdadeira a condição logo em seguida do seu exemplo,ela pode ficar:

SELECT*FROMDestinatario where1=1ANDNome ="Ramos da Informática"

Note que se não houvesse o WHERE 1=1,ela ficaria desta forma,e não funcionaria:

SELECT*FROMDestinatario ANDNome ="Ramos da Informática" --temos um erro aqui--^

Para uma condição ANDsó,o autor poderia ter posto o WHEREdentro da condição,mas se forem varias condiçoes,o WHERE 1=1permitiria várias condições separadas,montadas por ifs diferentes:

SELECT*FROMDestinatario where1=1SELECT*FROMDestinatario where1=1ANDNome ="Ramos da Informática"
SELECT*FROMDestinatario where1=1ANDCidade ="Uberlândia"
SELECT*FROMDestinatario where1=1ANDNome ="Ramos da Informática" ANDCidade ="Uberlândia"

Assim,o AND Nomepoderia estar em um ife o AND Cidadeem outro,e todos funcionariam independente de ter que saber se já há um ifanterior no código que gera o SQL.

Como mencionado pelo @bfavaretto,o CakePHP,por exemplo,utiliza esta técnica.

Particularmente,acho melhor usar maneiras mais limpas do que como foi usado,como concatenar com ANDsomente quando se tratar da 2ª condição em diante,mas cada um tem seus critérios,e em cada momento uma determinada técnica pode ser melhor do que outra.

Saindo desse exemplo específico de uso,pode até acontecer de alguém usar um WHERE“neutro”quando quer testar alguma condição durante o desenvolvimento do código,eliminando a condição original (equivalente a colocar WHERE true,que também serviria para a explicação inicial),mas isto já é outra história.

No nosso caso em específico,o IFdesta linha confirma a hipótese inicial do parâmetro opcional com AND:

IF(@paramISNOTNULL) --<==Aqui
SET@sql=(@sql+' AND Nome = '''+@param+'''');

Conclusão

Neste artigo,aprendemos a resposta para a antiga pergunta de “qual é o propósito do WHERE 1=1?”Não é uma técnica de otimização avançada,mas uma convenção de estilo adotada por alguns desenvolvedores.
Curso Banco de Dados

LEIA TAMBÉM:

Compartilhe:

Ramos da Informática
Ramos da Informáticahttps://ramosdainformatica.com.br
Ramos da Informática é um hub de comunidade sobre linguagens de programação, banco de dados, DevOps, Internet das Coisas, tecnologia da indústria 4.0, Cyber Segurança e Startups.

RECENTES

Claude Sonnet 4.5: Mais Avançado para Programação e Automação

A Anthropic acaba de lançar o Claude Sonnet 4.5,...

AP2 do Google: Desenvolva Pagamentos para agentes de IA

O Google lançou o Agent Payments Protocol (AP2), um...

Curso gratuito de GitHub Copilot para devs e estudantes

A Microsoft abriu as inscrições para o primeiro Bootcamp...

Santander e a Alura oferecem 60.000 bolsas em carreira de tecnologia

Quer dar um salto na sua carreira? O Santander Imersão Digital está...

Google Tradutor desafia o Duolingo com novas ferramentas de aprendizagem de idiomas

O Google está lançando um novo recurso experimental com...

A peça que faltava para agentes de IA autônomos.

Este artigo foi originalmente publicado em: https://www.linkedin.com/newsletters/ezine-dev-ramos-da-inform%25C3%25A1tica-6947960536550526976/ A inteligência...
Newsletter semanal no LinkedIn
EZine Dev Ramos da Informática
Grandes dicas em JavaScript, Node, React, Next, Banco de Dados & IA.
Assinar grátis
Abre em nova aba
spot_img