20

我是甲骨文的新手,我有一个问题。我有一个名为 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

谢谢您的帮助。

4

3 回答 3

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

小提琴

于 2013-03-22T14:31:30.480 回答
10

这是一个老问题,但它是谷歌的第一个热门话题,所以我想我会分享一个替代解决方案:

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 之后。对于我的情况,这已经足够了,但可能并非总是如此。

于 2015-08-21T09:37:09.937 回答
2

基于之前的解决方案:

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

这种方法的优点是您不需要知道表格列的大小。

于 2017-10-18T15:59:53.640 回答