Por que alguém colocaria `where 1 = 1` em uma consulta?

18

Hoje me deparei com uma visão em nosso banco de dados onde estava a primeira declaração na cláusula where where 1 = 1. Esse retorno não deveria ser verdadeiro para todos os registros? Por que alguém escreveria isso se não está filtrando nenhum registro?

goric
fonte
3
Porque eles querem cortar sombodys site ;-)
Tim Schmelter

Respostas:

40

Alguns construtores de consultas dinâmicas incluem essa condição para que quaisquer condições "reais" possam ser adicionadas com um ANDsem fazer uma verificação como if (first condition) 'WHERE' else 'AND'.

BenV
fonte
Parece estranho que um construtor de consultas não possa determinar se uma condição é a primeira de uma linha, mas também acho que você está certo.
ern0
3
geralmente é o caso quando o "construtor de consultas" é alguém que escreve um código para concatenar manualmente na instrução SQL. às vezes, a introdução de uma biblioteca de criação de consultas mais formal a elimina.
Araqnid
11
Eu tive que lidar com códigos "antigos" como esse, e é bem verdade. Quando você está montando toda a instrução SQL em uma única sequência, haverá grupos de instruções if / then ou case que podem ou não ser acionadas. Como você nunca sabe se algum desses caminhos de código é utilizado, MAS você tem um AND incorporado à sua cláusula WHERE (devido a uma cláusula que faz parte da cadeia), você precisa (a) remover o AND ofensivo ou ( b) simplesmente passar um truísmo lógico. Adicionar "1 = 1" é mais fácil do que redigir a string corretamente.
Avery Payne
5

Se você tiver muitos pontos de construção de instruções SQL em seu programa que geram consultas semelhantes , poderá marcar o examinado por este truque. Se a frase for sobre contagem, você pode usar o código abaixo para sair 42de um log SQL.

select count(42) from table
ern0
fonte
4

Ele fornece uma situação que é sempre verdadeira, portanto não afeta os resultados, mas você sabe que já existe um item na cláusula WHERE.

SchwartzE
fonte