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関数は、結果が数値でソートされるように、文字列の左側にスペースを埋め込みます。これは数値以外の値に対して機能し、null値は最後にソートされます。これは、ソートする文字列の最大長がわかっている場合にうまく機能します(ニーズに合わせて2番目のパラメーターを調整する必要がある場合があります)。

出典: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 に答える