Stronę najlepiej oglądać w rozdzielczości ekranu 1280x1024. Przy mniejszych rozdzielczościach skalowanie zdjęć z galerii powoduje znaczne zmniejszenie ich jakości.

Gościmy

Naszą witrynę przegląda teraz 18 gości 

Jak w MySQL posortować dane po polu char lub varchar jak liczby?
(2 głosów, średnia ocena 5.00 na 5)
Baza danych MySQL
poniedziałek, 17 stycznia 2011 11:49

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.

 

 

Dodaj komentarz