Por que usar WHERE 1 ou WHERE 1 = 1?


50

Normalmente, se as condições não forem necessárias em nossas instruções de consulta, não usamos uma WHEREcláusula. Mas já vi uma WHERE 1cláusula sendo usada em muitos lugares, mesmo onde outras condições não estão presentes.

  • Por que isso é feito?
  • Existem benefícios específicos para o tempo de execução?
  • Permite outras funcionalidades?
  • Está usando WHERE 1=1semelhante a isso?

Respostas:


45

Basicamente, é apenas para a conveniência do programador, pois você pode adicionar condições adicionais AND...depois disso e isso não afeta o tempo de execução.

Confira estes links para Stackoverflow:

Observe que WHERE 1é idêntico a WHERE 1=1; ambos significam, WHERE TRUEmas o primeiro é rejeitado por muitos sistemas de gerenciamento de banco de dados por não ser realmente booleano.


16

Meu uso principal é que torna mais fácil comentar coisas durante o desenvolvimento de consultas. Eu lidero com ,'e and':

SELECT
     A
--  ,B
    ,C
    ,D
--  ,E
FROM TABLE
WHERE 1=1
--  and B='This'
    and C='That'
--  and D is not null

Também facilita a aderência programada das coisas até o fim.

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

Caso contrário, você teria que qualificar a primeira opção ... e fazer com que cada opção a seguir verifique as opções anteriores. E se o usuário escolheu apenas a opção D no exemplo anterior? Você precisaria se certificar de que, em if A, B and C aren't chosenseguida, use WHEREelse use and. Com =no início, você pode dar um tapa nos qualificadores até o final da declaração.


11
E você escreveu esse código como 1980 em uma linguagem sem orientação a objetos, antes que alguém tivesse a idéia de um gerador sql baseado em objeto?
TomTom

Eu escrevo codesemelhante ao primeiro bloco no SSMS ou em ferramentas de consulta semelhantes. Pesquisando conjuntos de dados e obtendo os resultados certos antes de serem colocados em ferramentas de relatórios (como o Crystal Reports) para usuários finais. O segundo bloco é o que eu vi outras pessoas fazerem, já que meu trabalho não tem sido muito sobre acesso a sql bruto. Eu tenho problemas com código semelhante de outras pessoas e posso entender o raciocínio. (O código estava em VB, C # e PHP).
WernerCD

10

Por que fazemos isso?

A geração dinâmica de código escrita por programadores não muito competentes me vem à mente.

Gera SELECT .... WHERE e é necessário ter ALGO .... então, em vez de adicionar WHERE somente quando necessário, eles adicionam uma condição não limitativa quando não há nenhum. Visto que - responsável por demitir o "especialista".

Ou o cara apenas coisas ONDE é obrigatório;)

Qualquer outra coisa que eu falhe em ver.


5

Eu estava programando várias funções definidas pelo usuário em C ++ / C para PostgreSQL que foram usadas por outras pessoas em uma grande empresa (mais de 10 mil pessoas). Minhas funções possuem um whereparâmetro opcional : se nenhum valor foi fornecido, a cláusula não foi usada. Isso foi explicitamente documentado. Infelizmente, ninguém usou esse recurso e todos estão fornecendo apenas where 1=1cláusula. Teoricamente, isso parece imprudente, praticamente todos os otimizadores de consulta excluem esse tipo de declaração. E é difícil educar 10 mil pessoas.


3
Ninguém nunca ligou para o seu UDF WHERE 1=1; DROP TABLE CUSTOMERS?
Twinkles

Ainda assim, não consigo encontrar os conceitos por trás da cláusula Where 1. Precisa de mais esclarecimentos? Como não obtive nenhuma melhoria no tempo de execução.
ursitesion

Isso tem pouco a ver com o tempo de execução. Tem tudo a ver com a cultura como as pessoas programam. Às vezes acontece que seu código (programado por pessoas de TI) é usado por engenheiros. Esses caras têm sua própria maneira de pensar e invocar o seu código
arthur

@ Twinkles: esta é definitivamente uma questão interessante. Existem alguns pontos aqui a serem observados. (i) o banco de dados é somente leitura para a UDF (ii) Minha função une alguns grupos de tabelas por várias coisas e, para piorar, use as funções de janelas de armazenamento de dados. Isso torna desafiador descartar qualquer coisa, embora não seja impossível, (iii) as UDFs são destinadas ao código de pré-produção. O que significa que ele nunca fica em produção: se a função sobrevive ao desafio outro departamento reescreve completamente tudo o que programado
arthur

4
Na verdade, é muito fácil educar 10.000 pessoas. Faça com que o aplicativo falhe quando eles fizerem errado. Eles vão parar imediatamente de fazer errado.
Jasmine

2

O uso de "where 1 = 1" reduz a complexidade do código necessário na geração da cláusula sql dinâmica 'where'. Caso contrário, ao criar a cláusula 'where', você precisará verificar se este é o primeiro componente para cada componente adicionado. Esse é um padrão de código simples para reduzir a complexidade do código e, sempre que possível, reduzir a complexidade do código é quase sempre a decisão certa.


0

Aqui está ... do ponto de vista da programação, um uso de 1 = 1 ...insira a descrição da imagem aqui

Em uma situação como essa, quando eu preciso construir uma consulta em tempo de execução e ela pode ser curta ou longa, eu uso 'where 1 = 1 AND'

string criteria =string.Empty;
        if (txtc1.Text != "")
        {
            criteria += "criteria1=" + "'" + txtc1.Text + "' ";
        }
        if (txtc2.Text != "")
        {
            criteria += "OR criteria2=" + "'" + txtc2.Text + "' ";
        }
        if (ddl1.SelectedItem.Text != "")
        {
            criteria += "OR criteria3=" + "'" + ddl1.SelectedItem.Text + "' ";
        } if (ddl2.SelectedItem.Text != "")
        {
            criteria += "OR criteria4=" + "'" + ddl2.SelectedItem.Text + "' ";
        }
        if (ddl3.SelectedItem.Text != "")
        {
            criteria += "OR criteria5=" + "'" + ddl3.SelectedItem.Text + "' ";
        }
        if (ddl4.SelectedItem.Text != "")
        {
            criteria += "OR criteria6=" + "'" + ddl4.SelectedItem.Text + "' ";

        } 
        if (txtc1.Text == "")  
        {
            //criteria = criteria.Substring(2);
            criteria = criteria.Substring(2,criteria.Length-3);
        }
        if (criteria != string.Empty)
        {
            criteria = "where 1=1 AND " + criteria;
            //Response.Write("<script>alert('query constructed by you is : '+'" +criteria+ "');</script>");
            Response.Write(criteria);
        }

Facilite as coisas

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.