2013-03-22 381 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 

這種方法的好處是,你不需要知道表列大小。