Consultar um critério, se nulo, abrir outra consulta...

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola, boa tarde

Estou com uma situação, que no antigo visual basic 6, resolvia tranquilamente, porém no apex estou com dificuldades, eu tenho o seguinte, exemplo:

A planta de valores é definida por Setor ou Setor_Quadra
Setor
100 (setor)
100.001 (setor_quadra)


Tenho as inscrições de iptu da seguinte forma
100.001.0001.000
100.002.0001.000
100.003.0001.000

Seguindo esse ideia, eu precisa fazer um select que pesquisasse se existe uma planta de valores para o critério, tipo

eu pegaria parte inicial da inscrição: 100.002.0001.000

Selecionar tudo

SELECT indice INTO v_indice FROM planta_valores where setor = 100.002;  
(primeiro eu buscaria por setor_quadra)... se não tenho um planta com esse critério (100.002), ela seria vazia, logo eu já abriria outro select na sequencia

eu pegaria parte inicial da inscrição: 100.002.0001.000

Selecionar tudo

SELECT indice INTO v_indice FROM planta_valores where setor = 100;
... desse modo eu acharia uma planta de valores, carregando a variável


se alguém puder me dá uma dica, agradeço...
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

Bom, eu criei essa tabelinha pra conseguir entender melhor o exemplo:

Selecionar tudo

create table thomas (inscricao varchar2(100));

begin
insert into thomas values ('100.001.0001.000');

insert into thomas values ('200.001.0001.000');
insert into thomas values ('200.002.0001.000');
end;
Uma forma de fazer isso é fazer um UNION e dar uma prioridade pra cada consulta.
Por exemplo:
* Digamos que eu quero buscar 200.003.0001. (Não existe, portanto ele tem que ignorar o ultimo 0001 e buscar 200.003%).
* Busca 200.003 (Não existe, portanto, ele tem que buscar 200%)

Pra isso, eu fiz esse select com UNION:

Selecionar tudo

select 1 ordem, inscricao from thomas where inscricao like '200.003.0001%'
union all
select 2 ordem, inscricao from thomas where inscricao like '200.003%'
union all
select 3 ordem, inscricao from thomas where inscricao like '200.%'
order by ordem, inscricao;
Repare que ele retorna um campo chamado ORDEM, e faz um ORDER BY por esse campo.
Isso significa que a linha que me interessa é a primeira que é retornada.
example1.png
Pra buscar a primeira linha, basta deixar esse select sendo um SUB select.

Selecionar tudo

SELECT *
FROM 
  (select 1 ordem, inscricao from thomas where inscricao like '200.003.0001%'
union all
select 2 ordem, inscricao from thomas where inscricao like '200.003%'
union all
select 3 ordem, inscricao from thomas where inscricao like '200.%'
order by ordem, inscricao)
WHERE ROWNUM = 1;
Ou seja, é uma idéia. Se não é isso que você precisa, manda mais uns exemplos aí!
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

ola, boa noite...

Então, fiz o teste conforme sua dica, porém, não ficou exatamente do jeito que eu precisava, dai eu fiz assim:

Selecionar tudo

    [code]SELECT COUNT(CODIGO) INTO p_condicao_planta FROM IMOVEL_PLANTA_VALORES_IPTU where SETOR_QUADRA  = p_setor_quadra and ano = p_ano;

    --Se não tem valor diferenciado para a quadra, então pega o valor do setor
    IF p_condicao_planta = 0 THEN
        SELECT M2_TERRENO INTO metro_terreno FROM IMOVEL_PLANTA_VALORES_IPTU where [u]SETOR_QUADRA = p_seto[/u]r and ano = p_ano;
    ELSE
        SELECT M2_TERRENO INTO metro_terreno FROM IMOVEL_PLANTA_VALORES_IPTU where [u]SETOR_QUADRA = p_setor_quadra[/u] and ano = p_ano;
    END IF;
desta forma, eu resolvi... mas agradeço sua atenção e dica, guardei essa dica, pois posso precisar futuramente...

Muito obrigado
Responder
  • Informação
  • Quem está online

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