2013-03-22 151 views
11

我是oracle新手,遇到问题。 我有一个名为file_id的列。SQL Oracle排序字符串(数字)和(带数字的字母)

当我做一个订单由它按字符串,例如

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 

谢谢你的帮忙。

+0

“正确”是什么意思;你想要一个数字排序?接下来是二进制排序? – Ben 2013-03-22 14:25:17

+0

我编辑过,以表明我希望如何进行排序。感谢您提供如此快速的回应。 – user2199531 2013-03-22 14:30:38

+0

@ user2199531通过..按顺序添加一个案例,当col为null,然后2 else 1 end,regexp_substr(...' – DazzaL 2013-03-22 15:49:57

回答

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

fiddle

2

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

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

0

基于以前的解决方案:

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

这种方法的好处是,你不需要知道表列大小。

相关文章