Sortering af tal i MySQL tekst felter

Hvis du af en eller anden grund har nogle tal gemt i f.eks. VARCHAR eller TEXT felter i MySQL vil der være problemer med at sortere feltet med en almindelig SORT BY.
Hvis du har en tabel, min_tabel med en kolonne som hedder mit_felt af typen VARCHAR(20), som indeholder tallene 1, 2, 11, 23, 24 i hver sin række, vil du med en sætning som:

SELECT mit_felt FROM min_tabel ORDER BY mit_felt

Få resultatet

------------
| mit_felt |
------------
| 1        |
------------
| 11       |
------------
| 2        |
------------
| 23       |
------------
| 24       |
------------

Som jo ikke er det ønskede resultat. Grunden er at den sorteres som tekst. Dvs. at den tager et karater af gangen fra venstre. Så vil 11 komme før 2, da 1 er mindere end 2.

Der er flere forskellige måder at få MySQL til at sortere dette rigtigt.
Man kan lave en type cast på feltet og dermed tvinge restultatet til at blive sorteret som f.eks. et heltal.

SELECT mit_felt FROM min_tabel ORDER BY CAST(mit_felt, INT)

MySQL er desuden inteligent omkring data i feltet og man kan forsøge at lave et regnestykke med feltet hvilket vil resultere i at MySQL selv laver en type cast.

SELECT mit_felt FROM min_tabel ORDER BY (mit_felt + 0)

Begge de to fremgangsmåder ovenfor vil resultere i følgende:

------------
| mit_felt |
------------
| 1        |
------------
| 2        |
------------
| 11       |
------------
| 23       |
------------
| 24       |
------------

Det er også muligt at lave strengen om så der kommer til at stå x antal 0’er til venstre for tallet. På den måde vil alle tal være lige lange og de vil sorteret rigtigt.

SELECT mit_felt FROM min_tabel ORDER BY LPAD(mit_felt,4,'0')

Dette vil i sorteringen få felterne til at se ud som følgende:

------------
| mit_felt |
------------
| 0001     |
------------
| 0002     |
------------
| 0011     |
------------
| 0023     |
------------
| 0024     |
------------

Det er kun i den interne sortering at det vil komme til at se ud som ovenfor. Da det stadig er en tekst sortering vil du derfor få en sortering som neden for:

------------
| mit_felt |
------------
| 1        |
------------
| 2        |
------------
| 11       |
------------
| 23       |
------------
| 24       |
------------

VIGIGT! du skal passe på at man definere længende på strengen stor nok ellers vil det ikke få det ønskede resultat.

Leave a comment

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *

This site uses Akismet to reduce spam. Learn how your comment data is processed.