Ответ 1
select column
from table
order by
regexp_substr(column, '^\D*') nulls first,
to_number(regexp_substr(column, '\d+'))
Я новичок в оракуле, и у меня есть проблема. У меня есть столбец с именем file_id.
Когда я делаю заказ, он сортирует строки, такие как
1
1
10
100
11
11
110
114
12
300
31
4200
B14
B170
B18
изменить: Я бы хотел, чтобы он сортировался таким образом.
1
1
10
11
11
12
31
100
300
4200
B14
B18
B170
Ответ ниже работает отлично. Только другая проблема, с которой я столкнулся сейчас. У меня есть записи, которые пусты. Как я могу сделать заказ на пустые записи в конце?
1
1
10
11
11
12
31
100
300
4200
BLANK
BLANK
BLANK
BLANK
BLANK
B14
B18
B170
Благодарим вас за помощь.
select column
from table
order by
regexp_substr(column, '^\D*') nulls first,
to_number(regexp_substr(column, '\d+'))
Это старый вопрос, но это был первый хит в Google, поэтому я решил поделиться альтернативным решением:
select column
from table
order by
LPAD(column, 10)
Функция LPAD накладывает левую часть строки на пробелы, чтобы результаты сортировались численно. Это работает для нечисловых значений, а нулевые значения будут отсортированы последними. Это хорошо работает, если вы знаете максимальную длину строк для сортировки (вам может понадобиться отрегулировать второй параметр в соответствии с вашими потребностями).
Источник: http://www.techonthenet.com/oracle/questions/sort1.php
ИЗМЕНИТЬ:
Я заметил, что, хотя мое решение хорошо работает для моего случая, результат немного отличается от принятого ответа (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 должно появиться после 300. Для моей ситуации это достаточно хорошо, но это может быть не всегда так.
Основываясь на предыдущем решении:
SELECT column
FROM table
ORDER BY LPAD(column, (SELECT MAX(LENGTH(column)) FROM table)) ASC
Преимущество этого подхода в том, что вам не нужно знать размер столбца таблицы.