Ir ao conteúdo
  • Cadastre-se
diegosomar

Consulta SQL - Cláusula WHERE

Recommended Posts

Amigos, a minha dúvida parece simples, mas possui uma pegadinha que não consigo resolver de jeito nenhum. Preciso de ajuda superior.

Eis a tabela de demonstração:


+-------------+----------------+-----------------+
| id | coluna1 | coluna2 |
+-------------+----------------+-----------------+
| 1 | 7 | 1 |
+-------------+----------------+-----------------+
| 2 | 7 | 2 |
+-------------+----------------+-----------------+
| 3 | 7 | 3 |
+-------------+----------------+-----------------+
| 4 | 7 | 4 |
+-------------+----------------+-----------------+
| 5 | 5 | 1 |
+-------------+----------------+-----------------+
| 6 | 5 | 2 |
+-------------+----------------+-----------------+
| 7 | 5 | 3 |
+-------------+----------------+-----------------+
| 8 | 5 | 4 |
+-------------+----------------+-----------------+

O que preciso é pegar TODOS OS REGISTROS, onde coluna1 seja diferente de 7 e coluna2 seja diferente de 2, no mesmo registro. Também preciso que coluna1 seja diferente de 5 e coluna2 seja diferente de 4, também no mesmo registro.

Ou seja, executando uma consulta que retorne os registros de ID:

1,3,4,5,6,7

A consulta não pode retornar o id 2 pois no mesmo registro coluna1 é igual a 7 e coluna2 é igual a 2.

Também não pode retornar o id 8, pois no mesmo registro coluna1 é igual a 5 e coluna2 é igual a 4.

Montei a seguinte consulta:


SELECT * FROM tabela WHERE (coluna1 <> 7 AND coluna2 <> 2) AND (coluna1 <> 5 AND coluna2 <> 4)

A consulta acima não retorna nenhum resultado, pois o computador entende:

coluna1 <> 7, então não retorna os registros de id 1 até 4, independente da coluna2.

Também vai limar os ids de 5 a 8, pois estamos pedindo coluna1 <> 5.

É aí que está a pegadinha.

Agradeço à todos que puderem ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

Cuidado na escrita do problema, é isso que está te confundindo.

Pelo retorno que você fala que é o necessário, você descreveu o problema de forma errada.

Partindo pelo retorno que você quer (ID: 1,3,4,5,6,7), o certo é falar:

Preciso que a consulta retorne os registros onde

( col1 seja diferente de 7 ou col2 diferente de 2 )

e

( col1 seja diferente de 5 ou col2 diferente de 4 )

SELECT * FROM teste where (col1 != 7 or col2 != 2) and (col1 != 5 or col2 != 4);


SELECT * FROM teste where (col1 != 7 or col2 != 2) and (col1 != 5 or col2 != 4);

SELECT * FROM teste where !( (col1 = 7 AND col2 = 2) OR (col1 = 5 AND col2 = 4) );

SELECT * FROM teste where !(col1 = 7 AND col2 = 2) AND !(col1 = 5 AND col2 = 4);

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Erciley,

Obrigado pela resposta.

O meu problema era com a lógica do problema e confesso que demorei alguns minutos para entender a solução, mas após rabiscar um pouco entendi e vou compartilhar para que pessoas com o mesmo problema e não entenderam, possam entender:

ID: 1

COL1: 7

COL2: 1

Rodando a sua Query:


SELECT * FROM teste where (col1 != 7 or col2 != 2) and (col1 != 5 or col2 != 4);

Primeiro Parêntesis:

col1 != 7 = false

col2 != 2 = true

então: (col1 != 7 or col2 != 2) = ( false or true ) = true

Segundo Parêntesis:

col1 != 5 = true

col2 != 4 = true

então: (col1 != 5 or col2 != 4) = ( true or true ) = true

A condição inteira é:

(true) and (true) = true

Então ele vai retornar o primeiro registro, como esperado.

Indo até o segundo registro:

ID: 2

COL1: 7

COL2: 2

Primeiro Parêntesis:

col1 != 7 = false

col2 != 2 = false

então: (col1 != 7 or col2 != 2) = ( false or false ) = false

Segundo Parêntesis:

col1 != 5 = true

col2 != 4 = true

então: (col1 != 5 or col2 != 4) = ( true or true ) = true

A condição inteira é:

(false) and (true) = false

Então ele NÃO vai retornar o segundo registro, como esperado.

E assim por diante.

Mais uma vez obrigado pela resposta!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×