MySQL: Ordenar campos VARCHAR

Categoria: Programação

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 da 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 vírgula 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, usaríamos algo como:

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

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

zp8497586rq

Sobre o Autor
Junior Moro em Campo Grande, Mato Grosso do Sul e sou programador na dothCom.
Posts Relacionados
Comentários