Olá galera,
Hoje mostrarei como ordenar strings com delimitador '/' no SQL Server 2008. Imagine um campo cujo formato é 1/2013. O dígito antes da '/' é um número de autoincremento e após a barra é o ano corrente. Supondo que nossa tabela foi dada carga com as informações abaixo.
codigo |
1/2013 |
2/2013 |
3/2013 |
9/2013 |
11/2013 |
12/2013 |
2/2014 |
12/2014 |
20/2014 |
Vamos executar uma simples consulta organizando pelo código.
SELECT codigo FROM tabela ORDER BY codigo ASC
codigo |
1/2013 |
11/2013 |
12/2013 |
12/2014 |
2/2013 |
2/2014 |
20/2014 |
3/2013 |
9/2013 |
A informação foi organizada realmente mas o resultado ideal seria como a tabela abaixo.
codigo |
1/2013 |
2/2013 |
3/2013 |
9/2013 |
11/2013 |
12/2013 |
2/2014 |
12/2014 |
20/2014 |
Para obter esse resultado, minha solução foi o SQL abaixo.
SELECT codigo FROM tabela ORDER BY RIGHT(codigo, CHARINDEX('/', REVERSE(codigo))-1) ASC,
CONVERT(INT, LEFT(codigo, LEN(codigo) - CHARINDEX('/', REVERSE(codigo)))) ASC
Citarei cada uma das funções utilizadas na consulta.
- RIGHT - Retorna a parte da direita de uma cadeia de caracteres com o número de caracteres especificado.
- CHARINDEX - Pesquisa uma expressão para outra e retorna sua posição inicial, se for localizada.
- REVERSE - Retorna a ordem inversa de um valor da cadeia de caracteres.
- CONVERT - Converte uma expressão de um tipo de dados em outro.
- LEFT - Retorna a parte da esquerda de uma cadeia de caracteres com o número de caracteres especificado.
- LEN - Retorna o número de caracteres da expressão da cadeia de caracteres especificada, excluindo espaços em branco à direita.
OBS: Todas as descrições de cada função foram retiradas do site http://technet.microsoft.com/pt-br/library/ms174318.aspx
Conhece outra forma de fazer essa ordenação ?! Compartilhe conosco postando sua solução.
Um grande abraço a todos e até a próxima.