Problema ao Ordenar consulta SQL

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Avatar do usuário
Anderrssoon
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qui, 15 Mar 2012 7:34 am

Boa tarde pessoal, estou com um problema a realizar a ordenação de uma consulta SQL . Estou executando o seguinte código:

Selecionar tudo

SELECT eq.eq_tagiso,
            osc.eq_codigo, 
            eq.eq_tag, 
            eq.eq_tagiso, 
            eq.eq_descricao, 
            osc.osc_corre_trab,
            eqc.eqc_minimo, 
            eqc.eqc_maximo,
            eqc.eqc_nominal    
             
  FROM webuju.sami_equipamento eq,          
           webuju.sami_os_corrente  osc,         
            webuju.sami_equip_corrente eqc   
            
WHERE eqc.eq_codigo = eq.eq_codigo    
     AND eq.eq_codigo = osc.eq_codigo   
     AND osc.os_codigo = 127969 order by eq.eq_tagiso
Que retorna o seguinte resultado:


E o que acontece é que ele está seguindo uma ordem respeitando o menor número:

por exemplo:


T1
T2
T3
...
T10
T11
T100
...
T12
T13

Se alguém já passou por este problema e puder me ajudar, desde já, muito obrigado!
Anexos
Resultado da Consulta
Resultado da Consulta
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá Anderrssoon,

Por acaso a coluna "EQ_TAGSISO" de seu ORDER BY é sempre formada por esta máscara: "TC-nnnn" ?

Se for este o caso, acho que você consegue fazer uma ordenação correta usando as funções REPLACE, UPPER e TO_NUMBER.

Teste este exemplo em seu ambiente de desenvolvimento:

Selecionar tudo

Conectado a:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production

SQL> CREATE TABLE LIXO (CODIGO VARCHAR2(10));
Tabela criada.

SQL> INSERT INTO LIXO VALUES ('TC-0100');
1 linha criada.

SQL> INSERT INTO LIXO VALUES ('TC-10');
1 linha criada.

SQL> INSERT INTO LIXO VALUES ('Tc-11');
1 linha criada.

SQL> INSERT INTO LIXO VALUES ('tc-1');
1 linha criada.

SQL> COMMIT;

Commit concluido.

SQL> SELECT * FROM LIXO ORDER BY TO_NUMBER(REPLACE(UPPER(REPLACE(TRIM(CODIGO),' ','')),'TC-',''));

CODIGO
----------
tc-1
TC-10
Tc-11
TC-0100
SQL>
No exemplo acima, note que usei mais de um REPLACE, além de TRIM e UPPER. Fiz isso mais "por segurança", para garantir que estes filtros somente retornem números. O inconveniente desta solução - entretanto- é que você se tornará "refém dos dados" que forem armazenados na tabela. Se alguém digitar "TA-", "TO-", "ABACAXI-","ZA-", etc, você vai se deparar com um erro em sua querie. E pode ser bem trabalhoso identificar qual registro foi preenchido de forma errada.

Todo este trabalho que mostrei acima pode ser bastante simplificado se você usar EXPRESSOES REGULARES. Por exemplo, o SELECT acima poderia ser reescrito da seguinte forma:

Selecionar tudo

SQL> SELECT * FROM LIXO ORDER BY TO_NUMBER(REGEXP_REPLACE(CODIGO, '[^[:digit:]]+', ''));

CODIGO
----------
tc-1
TC-10
Tc-11
TC-0100
Este exemplo de expressão regular eu obtive a partir do link : http://stackoverflow.com/questions/3968 ... n-a-string

Abraços e boa sorte,

Sergio Coutinho
Avatar do usuário
Anderrssoon
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qui, 15 Mar 2012 7:34 am

Opá obrigado pela resposta Sergio, me deu uma luz para a solução.
No meu problema existem outras tags para estes equipamentos, como por exemplo CMVIII-10 ou ER-22. São tags utilizadas na industria que foram cadastradas no sistema.
thrrent
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 27
Registrado em: Dom, 29 Jan 2012 5:28 pm
Localização: Rio de Janeiro

Oi Anderson,

Se o caractere - "menos" é um padrão de separador entre letras e números, você poderá seguir o exemplo a seguir, que ordena primeiro pelas letras e depois pelos números.

Selecionar tudo

select substr(tab.a, 0, instr(tab.a,'-')-1) texto,
       substr(tab.a, instr(tab.a,'-')+1, 10) numero

from (
select 'TIC-123' a from dual
union all
select 'ZACWWW-2323' a from dual ) tab

order by substr(tab.a, 0, instr(tab.a,'-')-1),
         substr(tab.a, instr(tab.a,'-')+1, 10)
Espero ter ajudado, abraços
Responder
  • Informação
  • Quem está online

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