główna strona
wróć
[MySQL] Jak w MySQL posortować dane po polu char lub varchar jak liczby?
Ostatnia zmiana: 17.01.2011, Autor artykułu: Waldemar Miotk
baza2.jpg

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.
 

Komentarze(0)

Podpis:
W celu potwierdzenia, zaznacz pole pod znakiem: L
Capcha
(c)2007-2016 Waldemar Miotk - ostatnia aktualizacja silnika 06.02.2016 - Twój IP: 18.97.14.84. Ta strona, aby lepiej działać, używa plików cookie przechowywanych na komputerach użytkowników. Wszystkie prawa do tekstów zamieszczonych na stronie są zastrzeżone, chyba że przy konkretnym tekście znajduje się inna informacja.
go up