Você está usando Internet Explorer 6, um navegador antigo e com falhas de segurança. Por favor atualize seu navegador.
 
 
content top

MySQL: Ordenar campos VARCHAR

Quando uma coluna guarda um valor variado pode-se facilmente dá-la o tipo VARCHAR, ou pela ocasião ou pela inexperiência do desenvolvedor que criou/projetou a tabela. Só que num determinado momento o cliente pede para que a listagem dos registros desta tabela seja feita por esta coluna.

Ah, vamos mudar o tipo a coluna e fica resolvido, errado porque dependendo o tipo que você escolher os registros podem sofrer pequenas variações. Por exemplo o VARCHAR 7,7 pode ficar apenas 7 se você especificar, FLOAT, DECIMAL, INT ou qualquer outro tipo numérico pois teria que converter a virgula separadora para ponto.

Existe uma solução mais elegante para este tipo de caso. Você nem precisa mexer na bagunça do POGamador anterior (POG = Programação Orientada à Gambiarra). Você pode utlizar a função CAST() do MySQL. Esta função interpreta determinada coluna com o tipo que você especificar.

Suponha que temos a tabela “prova”, com as colunas “nome” e “nota” (ambos do tipo VARCHAR), para ordenarmos pela nota usariamos algo como:

1
2
3
SELECT nome, nota, CAST(REPLACE(nota,',','.') AS DECIMAL(20,2)) AS nota_convertida
FROM prova
ORDER BY CAST(nota AS UNSIGNED) DESC

Repare que usei CAST(nota AS DECIMAL(10,2)) para tentar pegar a coluna com o valor convertido, mas isso não funcionará quando o separador não for ponto, como citei anteriormente (Se alguém conhece uma forma de converter fique a vontade para compartilhar conosco).
Mas que pode ser tratado via PHP facilmente:

$nota = str_replace(',','.',$rs['nota']);

* Pequena correção: utilizando a função REPLACE() do MySQL você pode substituir caracteres.

Continuando, a função CAST() pode converter/interpretar as colunas nos seguintes formatos:

  • BINARY[(N)]
  • CHAR[(N)]
  • DATE
  • DATETIME
  • DECIMAL[(M[,D])]
  • SIGNED [INTEGER]
  • TIME
  • UNSIGNED [INTEGER]

Função CAST() e similares
Funções para Strings

1 Comentário »

  1. avatar
    Wanderson Disse:
    19.05.2010 às 16:08
    comment-top

    Muito bom o artigo. Parabéns

    comment-bottom

RSS feed para os comentários desse post. URL de TrackBack

Deixar um comentário