Você mesmo está complicando tudo cara, simplesmente é mais fácil você jogar uma varíavel ali no lugar daquele vt_d_lote (que provavelmente já é uma variável) e fazer a verificação antes de escrever o comando SQL se tiver sido informado o valor então vt_d_lote = x senão vt_d_lote = null aqui embaixo vem o comando SQL Mais simples do que escrever o comando SQL duas vezes, não?
_____ De: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Em nome de saulo Mendes Enviada em: quarta-feira, 21 de fevereiro de 2007 14:38 Para: Grupo de Usuários do PostgreSQL no Brasil Assunto: Re: [PostgreSQL-Brasil] dúvida com "null" :) vou tentar explicar melhor: veja...eu tenho um parâmetro que eu informo ao executar a função(no caso é o vt_d_lote) se eu informar o lote então a soma e feita com o lote que eu informar, caso eu informe "null" no parâmetro então a soma é feita com os lotes nullos. _____ From: [EMAIL PROTECTED] To: [email protected] Date: Wed, 21 Feb 2007 15:31:55 -0300 Subject: Re: [PostgreSQL-Brasil] dúvida com "null" Bem nesse caso, você pretende filtrar os lotes quando a variável não for nula OU filtrar tudo se a variável for nula. ok? select coalesce(sum(ie.qt_entrada*up.vr_fator), 0) from tb_itentrada_prod ie inner join tb_unid_produto up on (up.c_unid_produto = ie.c_unid_produto) and (up.d_unidade in ('E','A')) inner join tb_entrada_prod e on (ie.c_entrada_prod = e.c_entrada_prod) and (e.c_estoque = in_c_estoque) and (to_timestamp(e.dt_emissao||' '||e.hr_entrada, 'YYYY-MM-DD HH24:MI:SS') > coalesce(v_hr_inventario,'1900-02-20 11:18:14-03')) where (ie.c_produto = in_c_produto) and ( (vt_d_lote is not null and ie.d_lote = vt_d_lote) or (vt_d_lote is null) ) -- ----- Original Message ----- From: saulo <mailto:[EMAIL PROTECTED]> Mendes To: Grupo de Usuários do PostgreSQL <mailto:[email protected]> no Brasil Sent: Wednesday, February 21, 2007 2:08 PM Subject: Re: [PostgreSQL-Brasil] dúvida com "null" Esse é o meu grande problema: esse select não deve somar os lotes nulos e não-nulos. Na verdade essa é uma função onde eu informo o produto(in_c_produto) o estoque (in_c_estoque) e o lote(vt_d_lote). Esse comando deve realizar essa operação conforme o lote informado(se é nulo ou não). O que eu queria fazer era, justamente, evitar reescrever o sql apenas por causa do lote. entendeu? _____ From: [EMAIL PROTECTED] To: [email protected] Date: Wed, 21 Feb 2007 14:47:17 -0300 Subject: Re: [PostgreSQL-Brasil] dúvida com "null" Olá Saulo... Acho que pode ser isso aqui então: select sum(tabela.valortotal) as TOTAL_GELAL from (select coalesce(sum(ie.qt_entrada*up.vr_fator),0) as valortotal from tb_itentrada_prod ie inner join tb_unid_produto up on (up.c_unid_produto = ie.c_unid_produto) and (up.d_unidade in ('E','A')) inner join tb_entrada_prod e on (ie.c_entrada_prod = e.c_entrada_prod) and (e.c_estoque = in_c_estoque) and (to_timestamp(e.dt_emissao||' '||e.hr_entrada, 'YYYY-MM-DD HH24:MI:SS') > coalesce(v_hr_inventario,'1900-02-20 11:18:14-03')) where (ie.c_produto = in_c_produto) and ie.d_lote is null union all select coalesce(sum(ie.qt_entrada*up.vr_fator),0) as valortotal from tb_itentrada_prod ie inner join tb_unid_produto up on (up.c_unid_produto = ie.c_unid_produto) and (up.d_unidade in ('E','A')) inner join tb_entrada_prod e on (ie.c_entrada_prod = e.c_entrada_prod) and (e.c_estoque = in_c_estoque) and (to_timestamp(e.dt_emissao||' '||e.hr_entrada, 'YYYY-MM-DD HH24:MI:SS') > coalesce(v_hr_inventario,'1900-02-20 11:18:14-03')) where (ie.c_produto = in_c_produto) and ie.d_lote = vt_d_lote ) tabela ** Descrevendo esse sql, Faço um select de todos os lotes nulos + select de todos os lotes = à vt_d_lote; Usando a Teoria de Sub-Selects. Assim, conforme você descreveu pode ter a chave vazia ou não e ele somará as duas. Sidnei ----- Original Message ----- From: saulo <mailto:[EMAIL PROTECTED]> Mendes To: Grupo de Usuários do <mailto:[email protected]> PostgreSQL no Brasil Sent: Wednesday, February 21, 2007 1:31 PM Subject: Re: [PostgreSQL-Brasil] dúvida com "null" olá Sidnei, ainda não é isso veja... o campo d_lote pode ser vazio ou não...mas ambos trazem resultados diferentes no caso o resultado dessa consulta (select coalesce(sum(ie.qt_entrada*up.vr_fator),0)....) varia se o campo for nulo ou não, se eu utilizar (vt_d_lote is null or ie.d_lote = vt_d_lote) aí o resultado vai ficar incorreto. _____ From: [EMAIL PROTECTED] To: [email protected] Date: Wed, 21 Feb 2007 14:17:27 -0300 Subject: Re: [PostgreSQL-Brasil] dúvida com "null" Além disso....... Acho que não compreendi a sua pergunta no primeiro momento, mas o que você pretende fazer pode ser assim: where (ie.c_produto = in_c_produto) and (vt_d_lote is null or ie.d_lote = vt_d_lote) Abraços Sidnei ----- Original Message ----- From: saulo Mendes <mailto:[EMAIL PROTECTED]> To: [email protected] Sent: Wednesday, February 21, 2007 1:07 PM Subject: [PostgreSQL-Brasil] dúvida com "null" Senhores, em uma determinada função se eu comparar um valor de uma variável, e esta contiver um valor nulo a consulta não me traz o resultado. Gostaria de saber como equacionar isso de forma não-redundante. segue o trecho da consulta: select coalesce(sum(ie.qt_entrada*up.vr_fator),0) from tb_itentrada_prod ie inner join tb_unid_produto up on (up.c_unid_produto = ie.c_unid_produto) and (up.d_unidade in ('E','A')) inner join tb_entrada_prod e on (ie.c_entrada_prod = e.c_entrada_prod) and (e.c_estoque = in_c_estoque) and (to_timestamp(e.dt_emissao||' '||e.hr_entrada, 'YYYY-MM-DD HH24:MI:SS') > coalesce(v_hr_inventario,'1900-02-20 11:18:14-03')) where (ie.c_produto = in_c_produto) and (ie.d_lote = vt_d_lote) <<<< vt_d_lote é uma variável....se o valor dela for nulo(esse campo pode ser nulo) a consulta não me traz o valor correto pois o postgres não entendeu tipo, ie.d_lote = null. into vr_estoque_positivo; a solução parcial que encontrei é, antes de consulta (select coalesce...) eu testar se a variável é nula, caso seja eu reescrevo a função com o final ie.d_lote is null. Eu gostaria de eliminar esse redundância. agradeço, desde já. _____ O Windows Live Spaces está aqui! Descubra como é fácil criar seu espaço na Web e sua rede amigos. Confira! <http://spaces.live.com/signup.aspx> _____ _______________________________________________ Grupo de Usuários do PostgreSQL no Brasil Antes de perguntar consulte o manual http://pgdocptbr.sourceforge.net/ Para editar suas opções ou sair da lista acesse a página da lista em: http://pgfoundry.org/mailman/listinfo/brasil-usuarios _____ Ligue para os seus amigos grátis. Faça chamadas de PC-para-PC pelo messenger-- GRÁTIS Experimente agora! <http://get.live.com/messenger/overview> _____ _______________________________________________ Grupo de Usuários do PostgreSQL no Brasil Antes de perguntar consulte o manual http://pgdocptbr.sourceforge.net/ Para editar suas opções ou sair da lista acesse a página da lista em: http://pgfoundry.org/mailman/listinfo/brasil-usuarios _____ Descubra e experimente alguns novos serviços online no Windows Live Ideas Experimente! <http://ideas.live.com> _____ _______________________________________________ Grupo de Usuários do PostgreSQL no Brasil Antes de perguntar consulte o manual http://pgdocptbr.sourceforge.net/ Para editar suas opções ou sair da lista acesse a página da lista em: http://pgfoundry.org/mailman/listinfo/brasil-usuarios _____ Obtenha o novo Windows Live Messenger! Experimente! <http://get.live.com/messenger/overview>
_______________________________________________ Grupo de Usuários do PostgreSQL no Brasil Antes de perguntar consulte o manual http://pgdocptbr.sourceforge.net/ Para editar suas opções ou sair da lista acesse a página da lista em: http://pgfoundry.org/mailman/listinfo/brasil-usuarios
