Ir ao conteúdo
  • Cadastre-se

Consulta SQL - Cláusula WHERE


diegosomar

Posts recomendados

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.

Link para o comentário
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);

Link para o comentário
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!

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...