2013-05-13 11 views
43

Ja próbuje zamówić przez kolumnę z numerem w mojej bazy danych, która ma wartości 1-999SQL do zamawiania przez liczbę - 1,2,3,4 etc zamiast 1,10,11,12

Kiedy Używam

Mam ....

1 
101 
102 
103 
104 
105 
106 
107 
108 
109 
11 
110 
Etc… 

Wygląda więc na to, że zamawiam pierwszą cyfrę jako przeciwną do liczby.

Czy ktoś wie, jakiego języka SQL użyć, jeśli chcę zamówić to według wartości? Tak więc 1,2,3,4,5,6 itp.

+10

Twoja kolumna jest typu varchar z powodu których stoją takie zachowanie. – Meherzad

+0

jaki jest typ danych kolumny registration_no? –

+4

Użyj 'order by registration_no + 0 asc' aby rozwiązać swój problem. – Meherzad

Odpowiedz

35
ORDER_BY cast(registration_no as unsigned) ASC 

jawnie konwertuje wartość na liczbę. Inną możliwością osiągnięcia tego samego będzie wymuszenie niejawnej konwersacji przez:

ORDER_BY registration_no + 0 ASC 

.

Właściwie powinieneś sprawdzić definicję tabeli i ją zmienić. Można zmienić typ danych do int jak ten

ALTER TABLE your_table MODIFY COLUMN registration_no int; 
2

I zakładamy, że kolumna jest typu STRING (CHAR, VARCHAR, etc), a procedura sortowania jest sortowanie go jako ciąg znaków. Co musisz zrobić, to przekonwertować wartość na wartość liczbową. Sposób wykonania zależy od używanego systemu SQL.

66

Jeden sposób obciążenie dodatnie liczby całkowite, gdy są one przechowywane w varchar jest zamówienie przez pierwszy, a następnie wartość długości:

order by len(registration_no), registration_no 

Jest to szczególnie użyteczne, gdy kolumna może zawierać nienumeryczny wartości.

Uwaga: w niektórych bazach danych funkcja uzyskiwania długości ciągu może być nazwana length() zamiast len().

+1

Wow. Ze słów, które wyrażają mój podziw – Lordbalmon

+0

To nie zadziała we wszystkich przypadkach. W górnej części głowy przypadki, które nie będą działać, to miksy liczb całkowitych z; liczby ujemne, liczby z zerem na początku, liczby z ułamkami oraz liczby i liczby połączone. –

+7

@ Knickerless-Noggins. . . Przeczytaj pierwsze zdanie odpowiedzi. Myślę, że jest to całkiem jasne. –

8

Jeśli używasz SQL Server:

ORDER_BY cast(registration_no as int) ASC 
+0

bardzo dobrze, thx :) – Zombyii

1

Wolę robić "pad" do danych. MySql nazywa to LPAD, ale możesz popracować, aby zrobić to samo w SQL Server.

BY wymiany (STR (ColName, 3), w przestrzeni (1), 0 ')

Wzór zapewni prowadzi zerowe w zależności od długości słupa do 3. Funkcja ta jest bardzo użyteczna w sytuacjach, poza ORDER BY, dlatego chciałem udostępnić tę opcję.

Wyniki: 1 zmienia się na 001, a 10 na 010, a 100 pozostaje na tym samym poziomie.

0

Czasami po prostu nie masz wyboru, że musisz przechowywać numery zmieszane z tekstem. W jednej z naszych aplikacji host witryny, z której korzystamy w naszej witrynie e-commerce, dynamicznie tworzy filtry z list. Nie ma opcji sortowania według pola, ale wyświetlany tekst.Kiedy chcieliśmy, aby filtry zostały zbudowane na liście, która mówiła, że ​​takie rzeczy jak 2 "do 8" 9 "do 12" 13 "do 15" itp., Potrzebowaliśmy sortowania 2-9-13, a nie 13-2-9 jako będzie to podczas odczytywania wartości numerycznych. Użyłem więc funkcji SQL Server Replicate wraz z długością najdłuższego numeru, aby wstawić dowolne krótsze liczby z wiodącą przestrzenią. Teraz 20 jest sortowane po 3 i tak dalej.

Pracowałem z widokiem, który dawał mi minimalne i maksymalne długości, szerokości itp. Dla rodzaju i klasy przedmiotu, a tutaj jest przykład tego, jak zrobiłem tekst. (LB n niski i LB n wysokie są niskie i wysokie koniec nawiasach długości 5.)

REPLICATE(' ', LEN(LB5Low) - LEN(LB1High)) + CONVERT(NVARCHAR(4), LB1High) + '" and Under' AS L1Text, 
REPLICATE(' ', LEN(LB5Low) - LEN(LB2Low)) + CONVERT(NVARCHAR(4), LB2Low) + '" to ' + CONVERT(NVARCHAR(4), LB2High) + '"' AS L2Text, 
REPLICATE(' ', LEN(LB5Low) - LEN(LB3Low)) + CONVERT(NVARCHAR(4), LB3Low) + '" to ' + CONVERT(NVARCHAR(4), LB3High) + '"' AS L3Text, 
REPLICATE(' ', LEN(LB5Low) - LEN(LB4Low)) + CONVERT(NVARCHAR(4), LB4Low) + '" to ' + CONVERT(NVARCHAR(4), LB4High) + '"' AS L4Text, 
CONVERT(NVARCHAR(4), LB5Low) + '" and Over' AS L5Text 
Powiązane problemy