2013-05-13 9 views
43

Sto tentando di ordinare da una colonna serie nel mio database, che ha valori 1-999SQL per ordinare per numero - 1,2,3,4 ecc invece di 1,10,11,12

Quando Io uso

ORDER_BY registration_no ASC 

Ottengo ....

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

Quindi sembra essere l'ordine dalla prima cifra in opposizione al numero.

Qualcuno sa quale SQL utilizzare se si desidera ordinare questo valore? Così 1,2,3,4,5,6 ecc

+10

La colonna è di tipo varchar a causa del quale si trovano ad affrontare questo comportamento. – Meherzad

+0

qual è il tipo di dati di registration_no column? –

+4

Usa 'order by registration_no + 0 asc' per risolvere il tuo problema. – Meherzad

risposta

35
ORDER_BY cast(registration_no as unsigned) ASC 

converte in modo esplicito il valore su un numero. Un'altra possibilità per ottenere lo stesso sarebbe

ORDER_BY registration_no + 0 ASC 

che costringerà una conversazione implicita.

In realtà è necessario controllare la definizione della tabella e modificarla. È possibile modificare il tipo di dati a int come questo

ALTER TABLE your_table MODIFY COLUMN registration_no int; 
2

Presumo vostro tipo di colonna è STRING (char, varchar, ecc) e la procedura di ordinamento è l'ordinamento come una stringa. Quello che devi fare è convertire il valore in valore numerico. Come farlo dipenderà dal sistema SQL che usi.

66

Un modo per ordinare da numeri interi positivi, quando vengono memorizzati come varchar, è di ordinare dalla lunghezza e poi il valore:

order by len(registration_no), registration_no 

Ciò è particolarmente utile quando la colonna potrebbe contenere non numerico valori.

Nota: in alcuni database, la funzione per ottenere la lunghezza di una stringa potrebbe essere chiamata length() anziché len().

+1

Wow. Fuori dalle parole per esprimere il mio timore – Lordbalmon

+0

Questo non funzionerà in tutti i casi. Fuori dalla cima della testa, i casi che non funzionano sono mix di numeri interi con; numeri negativi, numeri con zeri iniziali, numeri con frazioni e parole e numeri combinati. –

+7

@ Noggins senza knicker. . . Leggi la prima frase della risposta. Penso che sia abbastanza chiaro. –

8

Se si utilizza SQL Server:

ORDER_BY cast(registration_no as int) ASC 
+0

molto buono, grazie :) – Zombyii

1

preferisco fare un "PAD" per i dati. MySql lo chiama LPAD, ma puoi lavorare come se facessi la stessa cosa in SQL Server.

ORDER BY REPLACE (STR (ColName, 3), SPACE (1), '0')

Questa formula fornirà gli zeri in base alla lunghezza della colonna 3. Questa funzionalità è molto utile in altre situazioni al di fuori di ORDER BY, ecco perché volevo fornire questa opzione.

Risultati: 1 diventa 001 e 10 diventa 010, mentre 100 rimane uguale.

0

A volte non si ha semplicemente la possibilità di memorizzare numeri mescolati con il testo. In una delle nostre applicazioni, l'host del sito Web che utilizziamo per il nostro sito di e-commerce rende i filtri dinamicamente fuori dagli elenchi. Non esiste alcuna opzione per ordinare in base a qualsiasi campo ma il testo visualizzato.Quando abbiamo deciso filtri costruita fuori una lista che ha detto le cose come 2" a 8" 9" a 12" 13" a 15" , ecc, abbiamo avuto bisogno di ordinare 2-9-13, non 13-2-9 come lo farà quando leggerà i valori numerici. Quindi ho usato la funzione di replica di SQL Server insieme alla lunghezza del numero più lungo per riempire eventuali numeri più brevi con uno spazio iniziale. Ora 20 è ordinato dopo il 3 e così via.

stavo lavorando con una vista che mi ha dato la lunghezza minima e massima, larghezza, ecc per il tipo di elemento e di classe, e qui è un esempio di come ho fatto il testo. (LB n Low e LB n alto sono il limite inferiore e superiore delle staffe 5 di lunghezza.)

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 
Problemi correlati