Select com where buscando numa array ou matriz

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 precisando criar um select que busque liste dos departamentos para o usuário conforme uma lista de codigo, algo assim:

Selecionar tudo

Select DESCRICAO from TABELA_DEPARTAMENTOS where CODIGO_DEPARTAMENTO = minha_array[1,2,5]
Lembrando que esse [1,2,5] será variável, conforme seja feito no cadastro do usuario para quais departamento ele poderá ver

Então vou ter um Item de Aplicativo chamada G_ID_DEPARTAMENTO

após a autenticação, ela será carregada com o valor que estiver no cadastro do usuario, tipo por exemplo

Selecionar tudo

select DEPARTAMENTO INTO :G_ID_DEPARTAMENTO  from MEUS_USUARIOS where upper(usuario) = :APP_USER;
na aplicacao, eu teria um select pra lista os departamentos para aquele usuario determinado, tipo assim

Selecionar tudo

Select DESCRICAO from TABELA_DEPARTAMENTOS where CODIGO_DEPARTAMENTO = :G_ID_DEPARTAMENTO 
agradeço quem puder ajudar...
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

estou tentando assim, mas com a variavel não funciona

Selecionar tudo

 select CODIGO,
    CODIGO_EMPRESA,
    CODIGO_DEPARTAMENTO,
    CODIGO_BANCO,
    AGENCIA,
    CONTA,
    from FINANCEIRO_BANCO_CONTA where CODIGO_EMPRESA = :g_id_empresa and CODIGO_DEPARTAMENTO in[b] (:G_ID_DEPARTAMENTO)[/b] order by CODIGO_BANCO
porém, fiz o teste assim, dá certo

Selecionar tudo

 select CODIGO,
    CODIGO_EMPRESA,
    CODIGO_DEPARTAMENTO,
    CODIGO_BANCO,
    AGENCIA,
    CONTA,
    from FINANCEIRO_BANCO_CONTA where CODIGO_EMPRESA = :g_id_empresa and CODIGO_DEPARTAMENTO in[b] (1,21)[/b] order by CODIGO_BANCO
essa variavel :G_ID_DEPARTAMENTO, esta carregada com o valor 1,21

ou seja, era pra funcionar, mas fala q a variavel é numero invalido
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5023
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

O ideal é construir uma variável com algum tipo de SEPARADOR. Por exemplo, ponto-e-vírgula, como no exemplo abaixo --> 'paulo@email.com;thomas@email.com'
Daí você pode rodar um TOKENIZER que transforma esses valores em ROWS.

Daí você pode usar assim:

Selecionar tudo

SELECT * 
FROM suatabela 
WHERE email IN (
                select REGEXP_SUBSTR(str, exp, 1, level) lista
                from (select 'paulo@email.com;thomas@email.com' str, '[^;]+' exp 
                    from dual) 
                connect by REGEXP_SUBSTR(str, exp, 1, level) is not null 
                )

Aqui tem vários exemplos de tokenizer:
viewtopic.php?t=753

Assim você evita criar um SQL dinâmico. (Que também seria uma solução).
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

ola, boa noite

Excelente, fiz os ajustes, conforme orientado, para chegar o valor do separador PONTO E VIRGULA, adequei para meu sistema, funcionou perfeitamente... muito obrigado
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5023
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

Nem precisa ser pont-e-vírugla... Pode ser qualquer separador.
No exemplo citado, isso é definido aqui: [^;]
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante