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

+0

私はソートをどのようにしたいのかを示すために編集しました。このような迅速な対応をありがとうございます。 – user2199531

+0

@ user2199531 orderの先頭にcaseを追加する。 'col by nullの場合は2、それ以外の場合は1 end、regexp_substr(...' – DazzaL

答えて

15
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機能パッドを左に文字列の - 側にスペースを入れて、結果が数値順にソートされるようにします。これは数値以外の値に対しても機能し、最後にヌル値がソートされます。これはソートする文字列の最大長が分かっている場合にうまく機能します(必要に応じて2番目のパラメータを調整する必要があります)。

出典:http://www.techonthenet.com/oracle/questions/sort1.php

EDIT
私は私の解決策は、私の場合に適していますが、出力は受け入れ答え(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私の状況ではこれで十分ですが、これは必ずしもそうではないかもしれません。

0

以前のソリューションに基づいて:

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

このアプローチの利点は、あなたがテーブルのカラムのサイズを知る必要がないことです。