Подтвердить что ты не робот

SQL Oracle Сортировка строки (числа) и (буквы с номерами)

Я новичок в оракуле, и у меня есть проблема. У меня есть столбец с именем 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

Благодарим вас за помощь.

4b9b3361

Ответ 1

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

fiddle

Ответ 2

Это старый вопрос, но это был первый хит в 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. Для моей ситуации это достаточно хорошо, но это может быть не всегда так.

Ответ 3

Основываясь на предыдущем решении:

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

Преимущество этого подхода в том, что вам не нужно знать размер столбца таблицы.