Jeżeli w naszej bazie danych zapisywaliśmy liczby w polu typu char lub varchar, to sortowanie po tym polu nie będzie dawało prawidłowych wyników. Dzieje się tak czasami, jeżeli np. do przechowywania cen w sklepie internetowym wykorzystaliśmy pole tekstowe. Baza danych posortuje tą tabelę tak jakby zapisane dane nie były liczbami, ale znakami.
Przypuśćmy, że w polu tekstowym znajdują się wpisy :
SELECT liczba FROM test
3.39
2.93
8.32
43.20
5.40
21.39
Po posortowaniu otrzymamy wyniki :
SELECT liczba FROM test ORDER BY liczba
2.93
21.39
3.39
43.20
5.40
8.32
Dzieje się tak dlatego, że baza danych nie dokonuje automatycznej konwersji danych i sortuje je tak jakby były danymi tekstowymi a nie liczbowymi. Aby uzyskać prawidłowe wyniki, należy dokonać konwersji tych danych z typu tekstowego do typu liczbowego.
Do konwersji danych służy funkcja CAST(), natomiast typ danych jako liczba zmiennoprzecinkowa określa DECIMAL().
Ustalmy więc, że nasze liczby nie będą większe niż 10 znakowe z dwoma miejscami po przecinku, i znajdują się w polu „liczba” w tabeli „test”. Sortowania więc możemy dokonać następująco:
SELECT * FROM test ORDER BY CAST( liczba AS DECIMAL( 10, 2 ) )
Jeżeli chcielibyśmy wyświetlić liczby po konwersji, możemy wykonać następującej operacji:
SELECT * , CAST( liczba AS DECIMAL( 10, 2 ) ) AS cena
FROM test ORDER BY cena
A co jeżeli liczby zmiennoprzecinkowe w naszej bazie zapisane są nie z kropką, ale z przecinkiem? Takie sortowanie też nie będzie prawidłowe, gdyż zostaną obcięte wszystkie cyfry po przecinku.
Wynik sortowania powyższych danych będzie następujący:
2.00
3.00
5.00
8.00
21.00
43.00
Aby dokonać prawidłowego sortowania, należy przed konwersją zamienić przecinki na kropki funkcją REPLACE(). Wykonujemy więc następujące zapytanie:
SELECT * , CAST( REPLACE( liczba, '','', ''.'' ) AS DECIMAL( 10, 2 ) ) AS cena FROM test ORDER BY cena
Teraz dane będą posortowane prawidłowo (zarówno z kropką jak i z przecinkiem):
Pole liczba : 2,93, Pole cena : 2.93 itd.