Retornar valor quando não houver registro.

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Cayo Magno Fontana
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Sex, 16 Nov 2007 8:12 am
Localização: ES

Bom dia,

Resumidamente, vou explicar o que acontece.

Tenho 27 tabelas, cujas são dados de planilhas do excel que as atualizo diariamente através de uma aplicação .NET que fiz. Enfim, essas tabelas possuem registros diários de funcionários. Não há qualquer ligação de dependência/relacionamento entre as tabelas, porém, existem algumas tabelas que opssuem funcionários em comum, outras não. Só que se eu fizer um select genérico para todas as tabelas pelo nome do funcionario, o retorno é sempre nulo, uma vez que há colunas que virão preenchidas, e há colunas que não virão.

Gostaria de saber se existe alguma forma de colocar um valor, tipo -1, nessas colunas que não retornarão valor.

Obrigado,

Cayo
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Pra isso, você pode usar NVL se os campos estão NULL.
Exemplo:

Selecionar tudo

select
  NVL( campo1, -1) campo1
, NVL( campo2, -1) campo2
, ...etc
Caso tenha um outro valor, você pode usar DECODE.
Exemplo: digamos que os campos que estão em branco estão vindo com um espaço em branco:

Selecionar tudo

select
  DECODE( campo1, ' ', -1, campo1) campo1
, DECODE( campo2, ' ', -1, campo2) campo2
, ...etc
Dessa forma acima, caso tenha um espaço em branco, ele vai colocar -1, senão coloca o próprio valor do campo.

Era isso?
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

e ai... beleza...

bom ao sei se eu q entendi ma mais oque você precisa é recerente ao valor retornar nulo ou não retornar valor nenhum???

caso seja a segunda opcao você deverá usar um outer join no seu where...

por exemplo:
o registro existe na tabela A porem é possivel que não exista na tabela B,
o select para retornar todos os caras da A

Selecionar tudo

  select *
  from A
        ,B
  where a.chave = b.chave(+)
Cayo Magno Fontana
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Sex, 16 Nov 2007 8:12 am
Localização: ES

Galera, sou novo no fórum, e estou surpreso com a rapidez no suporte.

Eu li a respeito da função NVL, não consegui compreender exatamente.
Amigos vou lhes mostrar em um exemplo bem rápido e simples, o meu problema. O que tenho é o seguinte:

Selecionar tudo

CREATE TABLE TABELA1
(
NOME VARCHAR(30) NOT NULL,
DATA DATETIME NOT NULL,
OS_ABERTAS INT NOT NULL,
OS_PENDENTES INT NOT NULL,
OS_FECHADAS INT NOT NULL)
 
CREATE TABLE TABELA2
(
 NOME VARCHAR(30) NOT NULL,
DATA DATETIME NOT NULL,
OS_ABERTAS INT NOT NULL,
OS_PENDENTES INT NOT NULL,
OS_FECHADAS INT NOT NULL)

INSERT INTO TABELA1
SELECT 'RICARDO', (SELECT GETDATE()), 2, 3, 1

SELECT * FROM TABELA1 AS T1, TABELA2 AS T2 WHERE T1.OS_ABERTAS *= T2.OS_ABERTAS AND T1.NOME='RICARDO'
No resultado desse select pelo "*=" consigo obter uma linha com todas as colunas das 2 tabelas. assim:

Selecionar tudo

RICARDO	2007-11-16 21:19:33.053	2	3	1	NULL	NULL	NULL	NULL	NULL
Note que as colunas que não possuem valor, retornam nulo, mas retornam!!

Mas isso tudo eu consegui fazer no SQL 2000, na empresa que desenvolvo, o banco é oracle. No oracle, como faço isso?? Porque no select q to fazendo, nada está sendo retornado pois se não existir valor em alguma coluna, ele não retorna linha nenhuma (fica identico a esse select, porém ao invés do "*=", o resultado sai como se eu tivesse usado apenas "=".
wolf_goe
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Sáb, 17 Nov 2007 2:21 pm
Localização: São Paulo - SP

Neste caso, use o explicado na segunda resposta.

Selecionar tudo

SELECT * FROM TABELA1 T1, TABELA2 T2 WHERE T1.OS_ABERTAS =  T2.OS_ABERTAS(+) AND T1.NOME='RICARDO';
ele retornará os campos da tabela2 como nulos, mesmo que nada seja encontrado nesta tabela.
Cayo Magno Fontana
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Sex, 16 Nov 2007 8:12 am
Localização: ES

Muito Obrigado a todos vocês, a dica ficou excelente!
Obrigado mesmo.
Renan Orati
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 90
Registrado em: Qui, 23 Ago 2007 3:40 pm
Localização: São José do Rio Preto - SP

Ow... tipo... eu acho que o que você precisa é um full join... vê se esse te serve:

Selecionar tudo

SELECT *
  FROM TABELA1 T1
    FULL OUTER JOIN TABELA2 T2
      ON (1.OS_ABERTAS = T2.OS_ABERTAS)
WHERE T1.NOME = 'RICARDO';
falou!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 19 visitantes