Select - Retornando 0

23/03/2006

olá pessoal,

Como posso fazer um select que mostre o valor 0(zero) caso seja nulo:
Teria como eu usar um if aqui dentro (cre.valor). if cre.valor is null then cre.valor := 0. Algo parecido.
 select sum(cre.valor)
                 from lancamentocont cre
                 where cre.data < :datainicio
                   and cre.tipodolancamento = 1


Obrigdo a todos,


Rodrigo.


Rodrigorpb

Respostas

23/03/2006

Aroldo Zanela

Colega,

Cada banco implementa isso de forma parecida, ou seja, uma função específica. Qual SGBDR que você está utilizando?


Responder Citar

23/03/2006

Rodrigorpb

Desculpe havia esquecido,

É Firebird 1.5.2


Responder Citar

23/03/2006

Arc

Não sei se no firebird funciona assim, mas no sql server eu uso o isnull

select sum(isnull(cre.valor,0))
from lancamentocont cre
where cre.data < :datainicio
and cre.tipodolancamento = 1


Responder Citar

23/03/2006

Rodrigorpb

arc obrigado pela ajuda mas não deu certo.

Seria isto mesmo que eu quero, que quando for null ele recebece 0(zero).


Rodrigo.


Responder Citar

23/03/2006

Aroldo Zanela

Colega,

Você deve instalar a fbudf para utilizar as funções de tratamento de Nulls no firebird. Note que ele possui uma função específica para cada tipo de dado.


Responder Citar

23/03/2006

Rodrigorpb

Na verdade estou tentando fazer um calculo em uma Store Procedure e se algum campo for nulo (Receita ou Despesa) ele naum retorna nada.

Ai gostaria de poder ferificar se é nulo colocar 0(zero),
Nesta parte do código:
        select
               ( select sum(cre.valor)
                 from lancamentocont cre
                 where cre.data < :datainicio
                   and cre.tipodolancamento = 1
               ) -
               ( select sum(deb.valor)
                 from lancamentocont deb
                 where deb.data < :datainicio
                   and deb.tipodolancamento = 2
               ) as saldoanterior,


se se algum for nulo ele naum retorna para o saldoanterior.
como posso arrumar isto?

Codigo completo:
CREATE PROCEDURE SPREL_SALDO (
    DATAINICIO DATE,
    DATAFIM DATE,
    CONTA INTEGER,
    TIPO CHAR(1))
RETURNS (
    SALDOANTERIOR NUMERIC(15,2),
    CREDITOS NUMERIC(15,2),
    DEBITOS NUMERIC(15,2),
    SALDOATUAL NUMERIC(15,2))
AS
begin
  if (:TIPO=´T´ ) then /*TODOS*/
    begin
        select
               ( select sum(cre.valor)
                 from lancamentocont cre
                 where cre.data < :datainicio
                   and cre.tipodolancamento = 1
               ) -
               ( select sum(deb.valor)
                 from lancamentocont deb
                 where deb.data < :datainicio
                   and deb.tipodolancamento = 2
               ) as saldoanterior,
               ( select sum(cre.valor)
                 from lancamentocont cre
                 where cre.data >= :datainicio
                   and cre.data <= :datafim
                   and cre.tipodolancamento = 1
               ) as creditos,
               ( select sum(deb.valor)
                 from lancamentocont deb
                 where deb.data >= :datainicio
                   and deb.data <= :datafim
                   and deb.tipodolancamento = 2
               ) as debitos
        from lancamentocont lan
        where lan.data >= :datainicio
          and lan.data <= :datafim
        group by 1, 2, 3
        into:saldoanterior, :creditos, :debitos;
        if (saldoanterior is null) then
          saldoanterior = 0;
        if (creditos is null) then
          creditos = 0;
        if (debitos is null) then
          debitos = 0;
        saldoatual = (saldoanterior + creditos - debitos);
        if (saldoatual is null) then
          saldoatual = 0;
    end
  else
  if (:TIPO=´S´ ) then /*SELECIONADO POR CONTA*/
    begin
        select
               ( select sum(cre.valor)
                 from lancamentocont cre
                 where cre.data < :datainicio
                   and cre.tipodolancamento = 1
                   and cre.contapatrimonial = :conta
               )-
               ( select sum(deb.valor)
                 from lancamentocont deb
                 where deb.data < :datainicio
                   and deb.tipodolancamento = 2
                   and deb.contapatrimonial = :conta
               ) as saldoanterior,
               ( select sum(cre.valor)
                 from lancamentocont cre
                 where cre.data >= :datainicio
                   and cre.data <= :datafim
                   and cre.tipodolancamento = 1
                   and cre.contapatrimonial = :conta
               ) as creditos,
               ( select sum(deb.valor)
                 from lancamentocont deb
                 where deb.data >= :datainicio
                   and deb.data <= :datafim
                   and deb.tipodolancamento = 2
                   and deb.contapatrimonial = :conta
               ) as debitos
        from lancamentocont lan
        where lan.data >= :datainicio
          and lan.data <= :datafim
          and lan.contapatrimonial = :conta
        group by 1, 2, 3
        into:saldoanterior, :creditos, :debitos;
        if (saldoanterior is null) then
          saldoanterior = 0;
        if (creditos is null) then
          creditos = 0;
        if (debitos is null) then
          debitos = 0;
        saldoatual = (saldoanterior + creditos - debitos);
        if (saldoatual is null) then
          saldoatual = 0;
    end
  suspend;
end



Responder Citar

23/03/2006

Rodrigorpb

Obrigado peesoal, o emerson.en resolvel para mim.

era apenas usar o comando coalesce:

select coalesce(sum(cre.valor), 0)
                 from lancamentocont cre
                 where cre.data < :datainicio
                   and cre.tipodolancamento = 1


Obrigado a todos e ao emerson.en.

Valeu.


Responder Citar

23/03/2006

Emerson

[quote:901bcfc4e6=´Aroldo Zanela´]Colega,

Você deve instalar a fbudf para utilizar as funções de tratamento de Nulls no firebird. Note que ele possui uma função específica para cada tipo de dado.[/quote:901bcfc4e6]

AZ, a partir do Firebird 1.5 foi implementada a função COALESCE() para esse tipo de situacão. Ela funciona de forma semelhante à função IsNull() do SQL Server.

exemplo de sintaxe da função COALESCE():
select 
  nome,
  COALESCE(telcomercial, telresidencial, telcelular, ´SEM TELEFONE´)
from
  cliente
na instrução acima será retornado o primeiro valor não-nulo.


Responder Citar

23/03/2006

Aroldo Zanela

Emerson.EN,

Valeu, eu já tinha visto outro tópico seu sobre isto e havia me esquecido.
Obrigado.


Responder Citar