2013-03-22 22 views
11

Sono nuovo di Oracle e ho un problema. Ho una colonna chiamata file_id.SQL Oracle Ordinamento stringa (numeri) e (lettere con numeri)

Quando faccio un ordine da esso ordina le stringhe quali

1 
1 
10 
100 
11 
11 
110 
114 
12 
300 
31 
4200 
B14 
B170 
B18 

edit: Vorrei che per ordinare in questo modo.

1 
1 
10 
11 
11 
12 
31 
100 
300 
4200 
B14 
B18 
B170 

La risposta di seguito funziona perfettamente. Solo l'altro problema che ho incontrato ora ... Ho dei record che sono vuoti. Come posso rendere l'ordine dei dischi vuoti alla fine?

1 
1 
10 
11 
11 
12 
31 
100 
300 
4200 
BLANK 
BLANK 
BLANK 
BLANK 
BLANK 
B14 
B18 
B170 

Grazie per il vostro aiuto.

+0

Cosa significa "correttamente"; ti piacerebbe un ordinamento numerico? seguito da un ordinamento binario? – Ben

+0

Ho modificato per mostrare come mi piacerebbe fare il genere. Grazie per una risposta così rapida. – user2199531

+0

@ user2199531 aggiungi un caso all'inizio dell'ordine da "ordine per caso quando col è null poi 2 else 1 fine, regexp_substr (...' – DazzaL

risposta

15
select column 
from table 
order by 
    regexp_substr(column, '^\D*') nulls first, 
    to_number(regexp_substr(column, '\d+')) 

fiddle

2

Questa è una vecchia questione, ma è stato il primo colpo su google così ho pensato di condividere una soluzione alternativa:

select column 
from table 
order by 
    LPAD(column, 10) 

Le pastiglie funzione LPAD la sinistra -sul lato della stringa con spazi in modo che i risultati vengano ordinati numericamente. Funziona per valori non numerici e i valori nulli verranno ordinati per ultimi. Ciò funziona bene se si conosce la lunghezza massima delle stringhe da ordinare (potrebbe essere necessario regolare il secondo parametro in base alle proprie esigenze).

Fonte: http://www.techonthenet.com/oracle/questions/sort1.php

EDIT:
ho notato che, mentre la mia soluzione funziona bene per il mio caso, l'uscita è leggermente diversa da quella risposta accettata (http://www.sqlfiddle.com/#!4/d935b8/2/0):

1 
1 
10 
11 
11 
12 
31 
100 
110 
114 
300 
A14 
A18 
4200 
A170 
(null) 
(null) 

4200 dovrebbe venire dopo 300. Per la mia situazione questo è abbastanza buono, ma questo potrebbe non essere sempre il caso.

0

Sulla base della precedente soluzione:

SELECT column 
FROM table 
ORDER BY LPAD(column, (SELECT MAX(LENGTH(column)) FROM table)) ASC 

Il vantaggio di questo approccio è che non è necessario conoscere la dimensione colonna della tabella.

Problemi correlati