Neulich hatte ich das Problem, dass in einer VARCHAR Spalte meiner MySQL Datenbank Zahlen mit unterschiedlich vielen Nachkommastellen standen. Da am Ende der Zahlen recht häufig Nullen vorkamen, die auch erhalten bleiben sollten, kamen die numerischen Feldtypen nicht in Frage, da diese entweder eine feste Anzahl Nachkommastellen angegeben haben möchten, diese dann aber mit Nullen auffüllen. Oder es werden, wenn keine Nachkommastellen Anzahl angegeben wird, die Nullen am Ende entfernt. Aber ich musste die Zahlen in dem VARCHAR Feld sortieren können, als wäre es eine Dezimalzahl.
Lösung
Die Lösung ist eigentlich ganz einfach. Wichtig hierfür ist nur, dass die Zahlen mit einem Punkt als Trennzeichen notiert sind, nicht mit einem Komma. Mittels der Funktion CAST können die Zahlen des VARCHAR Feldes in Dezimalzahlen umgewandelt werden. Das geht wie folgt:
CAST(ergebnis AS DECIMAL(12,6))
Code-Sprache: PHP (php)
In diesem Fall würde die Varchar Spalte ergebnis in den Typ DECIMAL umgewandelt werden. Diese Zahlen dürften maximal aus 12 Zeichen bestehen, wovon maximal 6 nach dem Punkt stehen dürfen. Nun werden die Zahlen, die weniger als 6 Stellen hinter dem Punkt haben, mit Nullen ausfgefüllt, wie es bei diesem Spaltentyp normal ist. Nun haben wir noch nicht viel gewonnen, das entscheidende kommt jetzt:
Wir lesen alle Spalten aus der Tabelle aus, inklusive unserer Spalte ergebnis. Anschließend wenden wir CAST an, um die Zahlen in Dezimalzahlen umzuwandeln, und geben diese mittels AS in einer anderen Spalte aus:
SELECT *, CAST(ergebnis AS DECIMAL(12,6)) as ergebnis_nummer FROM ergebnisse
Code-Sprache: PHP (php)
Wir lesen also die Daten aus der Tabelle ergebnisse aus und weisen der CAST-Umwandlung den Spaltennamen ergebnis_nummer zu. Nun haben wir alles, was wir benötigen. Mit ORDER BY können wir nun nach der Spalte ergebnis_nummer sortieren, also nach einer Spalte, die tatsächlich numerische Werte enthält. Ausgeben tun wir aber die Spalte ergebnis, die immer noch den Typ VARCHAR besitzt.