Array
(
)

AND e OR em cláusula SQL Server

Rodolpho França
   - 13 mai 2015

Olá a todos.
Estou realizando uma consulta em Sql Server 2014. Ela contém alguns Joins e algumas conversões de dados. Quando coloco na cláusula WHERE, onde eu quero o retorno de campos maiores que ZERO, ele retorna valores iguais a zero. Coloquei as imagens em anexo.
Agradeço a ajuda.
Clique na imagem para abrir em uma nova janelaClique na imagem para abrir em uma nova janela

Jothaz
   - 13 mai 2015

Posta a query! Senão não tem como ajudar!

Rodolpho França
   - 13 mai 2015

Opa Jothaz, desculpe, é que eu tinha enviado, mas deu erro na imagem.
Segue.

Clique na imagem para abrir em uma nova janela

Rodolpho França
   - 13 mai 2015

Opa Jothaz, desculpe, é que eu tinha enviado, mas deu erro na imagem.
Segue.

Clique na imagem para abrir em uma nova janela

Ceilton M
   - 13 mai 2015

O registros retornados com Quantidade Saldo Estoque = 0 tem Numero do documento igual a Null ???

O problema esta ai....

Faltam parênteses para fechar sua logica...

Rodolpho França
   - 13 mai 2015

Opa Cleiton, obrigado pelo retorno.
Respondendo sua pergunta, sim, o retorno da quantidade de soldo pode ter documentos igual a Null, vou explicar,
Vou gerar um arquivo texto a partir destas informações. Neste arquivo, deve informar todos os produtos com seus respectivos lotes. Se esses produtos estiverem em algum pedido, eu devo retornar o documento do cliente deste pedido. Por isso que eu posso ter as duas informações, a do produto com o documento igual a null e a do produto com o documento.

Atenciosamente.

Ceilton M
   - 13 mai 2015

A operação AND tem precedência sobre a operação OR.
Sua logica ficaria assim:
(expressão AND expressão AND expressão)
OR expressão.

Como a expressão apor o OR é de Numero do documento igual a Null , todos os registros com documento = Null serão retornados, independente do saldo em estoque.
Você esta dizendo ao banco que quer os registros que tenham saldo > 0 OU com documento = Null...

Entendeu ????

Jothaz
   - 13 mai 2015

#Código

declare @tab as table (id int, qtde int)
insert into @tab(id,qtde) values (1,null)
insert into @tab(id,qtde) values (2,44)
insert into @tab(id,qtde) values (1,0)
insert into @tab(id,qtde) values (1,77)

select * 
from @tab 
where qtde > 0 or qtde is null

Faabiianooc
   - 13 mai 2015

Seria

and (expressao1 or expressao2)

Rodolpho França
   - 13 mai 2015

Obrigado pelo retorno de todos.

Cleiton, eu entendi a sua proposta, mas não consegui fazer uma sintaxe na qual eu retorne todos os valores, pois preciso das duas informações, as Null e as preenchidas com o documento.

1- Eu preciso de todos os produtos com seus respectivos lotes.
2- Caso algum desses produtos estiverem em algum determinado tipo de pedido, retorne o CNPJ deste cliente.

O resultado deve conter todos os produtos, ele estando em algum pedido ou não.

Ceilton M
   - 13 mai 2015

Vou tentar

1 - códigopessoa = 85101
2 - filial = '0001'
3 - statuspedido = 'A'
4 - saldoestoque > 0
5 - numerolote <> '0'
and (
6 - codigodocumento = 1
7 - codigodocumento is null )

Vai filtrar : pessoa, filial, pedido, saldo > 0, lote, e ( documento = 1 ou sem documento)

É isso que você precisa ?????

Ceilton M
   - 13 mai 2015

Temos um problema que eu não tinha reparado.
Os joins com left join não terão o efeito esperado na clausula where.
Left join retorna todas as linhas do lado esquerdo da juncao.
Você esta colocando filtros de linhas na clausula where, de tabelas que ficarão a direita. PedidoCliente por exemplo.

Com isso a tabela de "Produto", que é a base da query do lado esquerdo, não será afetada,
resultando no retorno de todos os produtos.

Rodolpho França
   - 13 mai 2015

Obrigado pelo retorno.

Cleiton, é justamente isso que eu quero. Eu quero preservar os produtos, pois ela é o elemento principal da consulta. Deixa eu tentar explicar mais detalhadamente.

Eu vou gerar um arquivo texto onde será mostrado todos os produtos do estoque com seus respectivos lotes.
Caso algum produto esteja em um determinado tipo de pedido, eu tenho que gravar no arquivo o CNPJ do cliente.

Por Exemplo (arquivo texto):

Produto Lote Quantidade Custo Pedido CNPJ

3504305M 6831789-025 2.00UN 567.45 N
3504305M 6831789-025 1.00UN 567.45 S 12307187000150

No exemplo acima, eu tenho um produto, que está em um lote, com suas quantidades, onde uma unidade está num pedido e duas não estão em pedidos.

Ceilton M
   - 13 mai 2015

Faz o que te falei no post de 15:17h

Coloca as duas ultimas clausulas entre parênteses e uma com o resto por AND.

expressão and
expressão and
expressão and
expressão and
expressão and
( codigodocumento = 1 or codigodocumento is null )

Rodolpho França
   - 13 mai 2015

Desse modo, a consulta só resulta com o campo CNPJ preenchido.

Marcos P
   - 13 mai 2015

Rodolpho,

É difícil ajudar em uma situação dessas sem podermos ter um ambiente para simulação...

Você conhece o Fiddle ?

Conseguiria criar uma réplica da estrutura do banco lá e inserir registros para teste ?

Nesse ambiente temos mais chances de ajudá-lo !