none
Ordenar campo alfanumérico RRS feed

  • Discussão Geral

  • Olá,

    Necessito ordenar uma consulta onde o campo é alfanumérico. Exemplo 1, 1-A, 1-B, 1-C, 2, 3, 4-A, 5, 5-A, 100, 120-A.

    No script abaixo consegui ordenar a parte numérica, porém as letras não seguem a mesma ordem:

    SELECT CODIGO FROM PRODUTO 
    ORDER BY CONVERT(INT, CASE WHEN ISNUMERIC(CODIGO) = 1 THEN CODIGO
    ELSE LEFT(CODIGO,PATINDEX('%[^0-9]%', UPPER(CODIGO))-1)  END) 

    Resultado: 

    1-J
    1-I
    1-H
    1-G
    1-F
    1-E
    1-D
    1-C
    1-B
    1-A
    1
    2
    3
    4

    Como eu preciso que fique:

    1
    1-A
    1-B
    1-C
    1-D
    2
    3
    4
    5
    5-A
    5-B
    100
    100-A
    100-B

     

    sexta-feira, 23 de agosto de 2019 16:42

Todas as Respostas

  • Boa tarde,

    Supondo que a quantidade máxima de caracteres da coluna código seja 20, experimente fazer uns testes mais ou menos da seguinte forma:

    ORDER BY RIGHT( REPLICATE('0', 20) + CODIGO, 20)

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex sexta-feira, 23 de agosto de 2019 17:13
    sexta-feira, 23 de agosto de 2019 16:56
  • João_Pedro_1,

    Veja se este exemplo te ajuda: 

    -- Utilizando variável do Tipo Tabela --
    Declare @Valores Table
     (Codigo Varchar(3))
    
     Insert Into @Valores
     Values ('1-J'),
    ('1-I'),
    ('1-H'),
    ('1-G'),
    ('1-F'),
    ('1-E'),
    ('1-D'),
    ('1-C'),
    ('1-B'),
    ('1-A'),
    ('1'),
    ('2'),
    ('3'),
    ('4')
    
    Select * From @Valores
    Order By Codigo Asc -- Observe aqui o uso do comando Order By --
    Go

    Ou este outro:

    -- Utilizando uma tabela física --
    Create Table Valores
     (Codigo Varchar(5))
    
     Insert Into Valores
     Values ('1-J'),
    ('1-I'),
    ('1-H'),
    ('1-G'),
    ('1-F'),
    ('1-E'),
    ('1-D'),
    ('1-C'),
    ('1-B'),
    ('1-A'),
    ('100-C'),
    ('1'),
    ('2'),
    ('3'),
    ('4'),
    ('5'),
    ('100'),
    ('100-B')
    Go
    
    Select * From Valores
    Order By Codigo Asc -- Observe aqui o uso do comando Order By --
    Go

    Mas agora que eu observei o final do seu resultado, no qual o número 100 tem que ser apresentado após o 5, nos meus exemplos anteriores isso não se reflete.

    Veja estes exemplos:

    -- Utilizando a função PatIndex() --

    Select Codigo From Valores Order By Convert(Int,PATINDEX('%-',Codigo)) Asc

    Neste outro estou utilizando a função CharIndex():

    Select Codigo From Valores
    Order By Convert(Int,CharIndex('-',Codigo)) Asc
    Go
    
    Select Codigo From Valores
    Order By Convert(Int,CharIndex('-',Codigo)) Desc
    Go

    Veja este outro exemplo utilizando CTE, acredito que possa chegar próximo ao que você deseja, estou considerando somente as três primeiras posições do número:

    ;With CTEClassificar
    As
    (
    Select Codigo,
               ROW_NUMBER() Over (Partition By SubString(Codigo,1,3) Order By Codigo) As MinhaSequencia
    From Valores
    )
    Select Codigo From CTEClassificar
    Order By MinhaSequencia Asc

    Desculpe pelos primeiros exemplos, eles provavelmente não seriam a resposta com base no seu resultado.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]





    • Editado Junior Galvão - MVPMVP sábado, 24 de agosto de 2019 02:29 Correção do exemplo de código utilizando as funções PatIndex() e CharIndex().
    sexta-feira, 23 de agosto de 2019 17:04
  • Deleted
    sexta-feira, 23 de agosto de 2019 17:10
  • Olá José, com seu script consegui solucionar meu problema. Obrigado.
    sexta-feira, 23 de agosto de 2019 20:49
  • Olá João , 

    Neste caso , marque a resposta do José como a que resolveu o caso. 

    Sempre ajuda para quando alguma outra pessoa tiver problema semelhante ir direto a resposta certa.

    Abraços!! 


    Jefferson Clyton Pereira da Silva - [MCSA | MCP | MCTS | MTA | Analista de Banco de Dados - Sql Server e Oracle ]

    segunda-feira, 26 de agosto de 2019 02:00