2013-03-22 15 views
11

Jestem nowy w wyroczni i mam problem. Mam kolumna o nazwie file_id.SQL Oracle Sortuj ciąg (liczby) i (litery z numerami)

Kiedy zrobić zamówienie przez sortuje ciągi takie jak

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

EDIT: chciałbym go rozwiązać w ten sposób.

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

Poniższa odpowiedź działa idealnie. Tylko inny problem, na który natrafiłem. Mam rekordy, które są puste. Jak mogę zrobić puste zamówienie na koniec?

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

Dziękuję za pomoc.

+0

Co oznacza "prawidłowo"; chcesz sortować numerycznie? po którym następuje sortowanie binarne? – Ben

+0

Edytowałem, aby pokazać, jak bym chciał tego dokonać. Dziękuję za tak szybką odpowiedź. – user2199531

+0

@ user2199531 dodaj sprawę do początku zamówienia przez .. 'zamówienie przez przypadek, gdy col ma wartość null, a następnie 2 inne 1 koniec, regexp_substr (...' – DazzaL

Odpowiedz

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

fiddle

2

To stara sprawa, ale było to pierwsze trafienie w google więc pomyślałem, że podzielę się alternatywne rozwiązanie:

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

klocki funkcyjne LpAd lewy -side ciągu znaków ze spacjami, aby wyniki były sortowane numerycznie. Działa to dla wartości nienumerycznych, a wartości puste zostaną posortowane jako ostatnie. Działa to dobrze, jeśli znasz maksymalną długość sortowanych ciągów (może być konieczne dostosowanie drugiego parametru do własnych potrzeb).

Źródło: http://www.techonthenet.com/oracle/questions/sort1.php

EDIT:
Zauważyłem, że gdy moje rozwiązanie działa dobrze w moim przypadku, wyjście jest nieco inna od przyjętej odpowiedzi (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 powinien przyjść po 300. Dla mojej sytuacji jest to wystarczająco dobre, ale nie zawsze tak jest.

0

podstawie poprzedniego rozwiązania:

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

Zaletą tego podejścia jest to, że nie trzeba znać rozmiar kolumny tabeli.

Powiązane problemy