Consulta SQL, tabela verdade

4 respostas
D

Olá pessoal, tive um problema em um SQL, o qual não era para retornar registro algum, mas retornou um. A questão é a seguinte, os parametros da minha pesquisa resultaram no seguinte: a primeira condição deu TRUE a segunda FALSE a terçeira TRUE e a quarta FALSE, com os operadores OU, OU e AND, ficando tabela true OU false OU true AND false, a questão é como pode retornar registros este select se tenho um AND false no final? resolvi o problema com (true OU false OU true) AND false, mas confesso que não entendi como é calculada estas condições, alguém pode me explicar o por que retornou registro?

select xxx from yyy where true OU false OU true AND false

4 Respostas

F

Olá dudu795,

Na boa, tenta explicar melhor sua dúvida, veja que nem você conseguiu entender o resultado, imagina nós entender a dúvida.

Abraços.

_ _
Fabiano Abreu
Papo Sql - Um blog com tutoriais, dicas e truques sobre SQL

A

O problema de misturar OR e AND no mesmo select é que você não sabe onde "começa" um e "termina" o outro.

Você pode pensar que o OR está um nível acima.

Para ficar claro, um exemplo. Para a seguinte tabela (em Mysql):

drop table if exists Pessoas;

create table Pessoas
(
  nome varchar(100),
  idade int,
  sexo varchar(1)
);

insert into Pessoas
select 'Abel', 30, 'M' union
select 'Bruno', 18, 'M' union
select 'Carla', 25, 'F' union
select 'Daniela', 32, 'F';

Considere a seguinte situação:
Numa tabela de pessoas quero selecionar todas as mulheres abaixo de 30 anos e todos os homens acima de 30.

Podemos tentar o seguinte:

O OR vai separar as condições em 2 grupos, sendo o equivalente ao código abaixo:

Portanto, neste caso, conseguimos responder a query do jeito que queremos.

Agora, uma outra situação:
Selecionar todos os homens abaixo de 18 ou acima de 25. Podemos tentar o seguinte:

Mas isso será lido, na verdade, como o seguinte:

Trazendo todo mundo acima de 25 independente do sexo.

No seu exemplo, como a primeira expressão já retornou true, ele irá retornar o registro.

Para não precisar pensar nessa ordem de avaliação, use parenteses sempre que for misturar AND e OR no mesmo WHERE.
Sua intenção fica explicíta e evita esse tipo de engano.

E

A prioridade do AND é maior que a do OR (é como se o AND fosse multiplicação e o OR fosse adição).

Mas como lhe disseram, se você acha que vai dar confusão, ponha parênteses. Isso não vai deixar sua query mais lenta ou mais rápida, e vai lhe ajudar com a redução de confusão (lembre-se que código foi feito para ser lido por humanos também :slight_smile: )

Um exemplo para o dialeto usado pelo MS SQL Server: http://msdn.microsoft.com/en-us/library/ms190276.aspx

D

dúvida esclarecida.

Criado 19 de março de 2012
Ultima resposta 21 de mar. de 2012
Respostas 4
Participantes 4