Array
(
)

Select - Retornando 0

Rodrigorpb
   - 23 mar 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.
#Código

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


Obrigdo a todos,


Rodrigo.


Aroldo Zanela
   - 23 mar 2006

Colega,

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


Rodrigorpb
   - 23 mar 2006

Desculpe havia esquecido,

É Firebird 1.5.2


Arc
   - 23 mar 2006

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


Rodrigorpb
   - 23 mar 2006

arc obrigado pela ajuda mas não deu certo.

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


Rodrigo.


Aroldo Zanela
   - 23 mar 2006

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.


Rodrigorpb
   - 23 mar 2006

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:
#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:
#Código
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



Rodrigorpb
   - 23 mar 2006

Obrigado peesoal, o emerson.en resolvel para mim.

era apenas usar o comando coalesce:

#Código

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.


Emerson
   - 23 mar 2006


Citação:
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.


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():
#Código

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


Aroldo Zanela
   - 23 mar 2006

Emerson.EN,

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