Página 1 de 1

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

Enviado: Qua, 26 Mai 2021 4:22 pm
por carlynhos77
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...

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

Enviado: Sex, 04 Jun 2021 1:12 pm
por dr_gori
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í!

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

Enviado: Qui, 17 Jun 2021 7:03 pm
por carlynhos77
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