Inquiridor
Ordenar campo alfanumérico

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
4Como 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
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
-
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().
-
-
-
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 ]