Próbuję uporządkować według kolumny liczb w mojej bazie danych, która ma wartości 1-999
Kiedy używam
ORDER_BY registration_no ASC
Dostaję….
1
101
102
103
104
105
106
107
108
109
11
110
Etc…
Wygląda więc na to, że jest to kolejność według pierwszej cyfry, a nie liczby.
Czy ktoś wie, jakiego języka SQL użyć, jeśli chcę to uporządkować według wartości? Więc 1,2,3,4,5,6
itd
sql
sql-order-by
Konnor262
źródło
źródło
order by registration_no + 0 asc
aby rozwiązać problem.Odpowiedzi:
Jednym ze sposobów uporządkowania według dodatnich liczb całkowitych, gdy są one przechowywane jako
varchar
, jest uporządkowanie najpierw według długości, a następnie według wartości:Jest to szczególnie przydatne, gdy kolumna może zawierać wartości nienumeryczne.
Uwaga: w niektórych bazach danych
length()
zamiast funkcji można wywołać funkcję uzyskiwania długości łańcuchalen()
.źródło
order by
ma niewielki wpływ na wydajność.length()
zamiastlen()
jawnie konwertuje wartość na liczbę. Inną możliwością osiągnięcia tego samego byłoby
co wymusi niejawną rozmowę.
Właściwie powinieneś sprawdzić definicję tabeli i ją zmienić. Możesz zmienić typ danych w
int
ten sposóbALTER TABLE your_table MODIFY COLUMN registration_no int;
źródło
Jeśli używasz SQL Server:
źródło
daje pożądany rezultat z ostrzeżeniami.
Dlatego lepiej iść
aby uzyskać czysty wynik bez ostrzeżeń SQL.
źródło
Zakładam, że typ kolumny to STRING (CHAR, VARCHAR itp.), A procedura sortowania sortuje ją jako ciąg. To, co musisz zrobić, to przekonwertować wartość na wartość liczbową. Sposób wykonania zależy od używanego systemu SQL.
źródło
Czasami po prostu nie masz wyboru, czy musisz przechowywać liczby zmieszane z tekstem. W jednej z naszych aplikacji host witryny internetowej, którego używamy w naszej witrynie handlu elektronicznego, dynamicznie usuwa filtry z list. Nie ma opcji sortowania według dowolnego pola poza wyświetlanym tekstem. Kiedy chcieliśmy, aby filtry składały się z listy zawierającej takie rzeczy jak od 2 "do 8" 9 "do 12" 13 "do 15" itd., Potrzebowaliśmy sortowania 2-9-13, a nie 13-2-9, jak będzie to miało miejsce w przypadku odczyt wartości liczbowych. Więc użyłem funkcji SQL Server Replicate wraz z długością najdłuższej liczby, aby dopełnić mniejsze liczby spacją wiodącą. Teraz 20 jest sortowane po 3 i tak dalej.
Pracowałem z widokiem, który podał mi minimalne i maksymalne długości, szerokości itp. Dla typu i klasy przedmiotu, a oto przykład tego, jak zrobiłem tekst. (LB n Low i LB n High to dolny i górny koniec 5 nawiasów długości.)
źródło
Wolę robić „PAD” do danych. MySql nazywa to LPAD, ale możesz zrobić to samo w SQL Server.
ORDER BY REPLACE(STR(ColName, 3), SPACE(1), '0')
Ta formuła zapewni zera wiodące na podstawie długości kolumny równej 3. Ta funkcja jest bardzo przydatna w innych sytuacjach poza ORDER BY, dlatego chciałem udostępnić tę opcję.
Wyniki: 1 staje się 001, a 10 staje się 010, a 100 pozostaje bez zmian.
źródło
Ten problem występuje po prostu dlatego, że zadeklarowałeś kolumnę w typie danych CHAR, VARCHAR lub TEXT. Po prostu zmień typ danych na INT, BIGINT itp. To rozwiązuje problem niestandardowego zamówienia.
źródło