Ordenar resultado de query por valores em clausula IN

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Preciso rodar uma query que traz alguns dados de determinada tabela, onde os itens que desejo retornar serão especificados em uma clausula IN.
Por exemplo:

Selecionar tudo

SELECT CAMPO1, CAMPO2, CAMPO3
   FROM TABELA
   WHERE CAMPO2 IN (30,40,55,12,3,99,130,25)
Porém, preciso ordenar o resultado pela ordem de valores inseridos no IN, nesse caso a primeira linha seria onde o campo2 fosse 30, depois 40, e assim por diante, até o 25.

Como eu poderia fazer isso?

Obrigado.
danielpbarros
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 67
Registrado em: Dom, 15 Jan 2012 9:34 pm
Contato:
Daniel Barros

tenta assim e veja se funciona.

Selecionar tudo

SELECT CAMPO1, CAMPO2, CAMPO3
   FROM TABELA
   WHERE CAMPO2 IN (30,40,55,12,3,99,130,25)
   order by campo2
ainda pode utilizar desc ou asc para mudar a ordenação da query.
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

danielpbarros escreveu:tenta assim e veja se funciona.

Selecionar tudo

SELECT CAMPO1, CAMPO2, CAMPO3
   FROM TABELA
   WHERE CAMPO2 IN (30,40,55,12,3,99,130,25)
   order by campo2
ainda pode utilizar desc ou asc para mudar a ordenação da query.
Daniel, obirgado pela resposta.
Porém essa solução não resolve o meu problema, pois nesse caso a linha que contém o valor 3 apareceria antes da linha com o valor 30. O que eu precisaria era exibir os dados na ordem exata que foi passado no IN.
paulochagas
Moderador
Moderador
Mensagens: 86
Registrado em: Qua, 15 Mar 2006 2:46 pm
Localização: São Paulo - SP
Paulo Chagas Filho
__________________

Analista Funcional / Desenvolvedor Oracle EBS
MSN - paulochagas@hotmail.com
Gtalk - pachafi@gmail.com
Skype - paulochagas

Olá jks1903

Esses valores do in são passados dinamicamente ou são fixos e se são fixos é essa a quantidade de valores ou a lista é bem maior?
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

paulochagas escreveu:Olá jks1903

Esses valores do in são passados dinamicamente ou são fixos e se são fixos é essa a quantidade de valores ou a lista é bem maior?
Os valores são dinâmicos, ora podem ter 2 ou 3 e ora podem ter mais de 50 valores.
Essa query servira para montar um relatório de conferencia, onde o usuário tem uma rotina que recebe um relatório em PDF e precisa comparar com esse que quero montar.

Porém esse PDF não possui uma classificação fixa. Como o usuário acha complicado e trabalhoso ficar copiando os dados para uma planilha de cálculo para ordenar os valores (o que até concordo), pensei na possibilidade de gerar um relatório na mesma ordem desse que ele recebe, porém para isso necessitaria ordenar pelos valores passados na clausula IN, se possível.

Obrigado.
paulochagas
Moderador
Moderador
Mensagens: 86
Registrado em: Qua, 15 Mar 2006 2:46 pm
Localização: São Paulo - SP
Paulo Chagas Filho
__________________

Analista Funcional / Desenvolvedor Oracle EBS
MSN - paulochagas@hotmail.com
Gtalk - pachafi@gmail.com
Skype - paulochagas

Sem pensar muito em performance pensei em algo tipo um decode no order by para os seus valores.
Como estamos falando de uma query montada dinamicamente, na passagem dos valores você poderia fazer um for para montar uma clausula tipo esta:

Selecionar tudo

SELECT CAMPO1, CAMPO2, CAMPO3
   FROM TABELA
   WHERE CAMPO2 IN (30,40,55,12,3,99,130,25)
   order by decode(campo2,30,1
                         ,40,2
                         ,55,3
                         ,12,4
                         ,3,5
                         ,99,6
                         ,130,7
                         ,25,8
                        ,campo2);       
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Se os dados são gerados dinamicamente e tem que ser na ordem que você postou lá, eu criaria uma tabela temporária com esses valores gerados que vão para dentro do IN.
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

paulochagas escreveu:Sem pensar muito em performance pensei em algo tipo um decode no order by para os seus valores.
Como estamos falando de uma query montada dinamicamente, na passagem dos valores você poderia fazer um for para montar uma clausula tipo esta:

Selecionar tudo

SELECT CAMPO1, CAMPO2, CAMPO3
   FROM TABELA
   WHERE CAMPO2 IN (30,40,55,12,3,99,130,25)
   order by decode(campo2,30,1
                         ,40,2
                         ,55,3
                         ,12,4
                         ,3,5
                         ,99,6
                         ,130,7
                         ,25,8
                        ,campo2);       
Realmente é uma idéia interessante.
Vlw.
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

tiago_pimenta escreveu:Se os dados são gerados dinamicamente e tem que ser na ordem que você postou lá, eu criaria uma tabela temporária com esses valores gerados que vão para dentro do IN.
Tiago, no caso não tenho permissao para criar objetos nessa base, apenas consigo fazer consultas mesmo.

Obrigado.
Responder
  • Informação
  • Quem está online

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