2017-01-19 6 views
1

テーブル定義は次のようである:整数値を降順に並べ替えるにはどうすればいいですか?

create table test_1 
(match_id varchar2(30), ts timestamp); 

match_idは、整数の形式である[A | B]、例えば1.A、1.B、99.A又は99.B.として。同じ整数のmatch_idを持つ行をペアと呼びます。したがって、1.Aと1.Bはペアであり、99.Aと99.Bは別のペアです。データベースはOracle 11.2以降です。

SQL> insert into test_1 values ('1.A',current_timestamp); 
SQL> insert into test_1 values ('1.B',current_timestamp-10); 
SQL> insert into test_1 values ('100.A',current_timestamp-20); 
SQL> insert into test_1 values ('100.B',current_timestamp-30); 
SQL> insert into test_1 values ('99.A',current_timestamp-40); 
SQL> insert into test_1 values ('99.B',current_timestamp-50); 

Iは、100.B、100.A、99.B、99.A、1.B、1.Aしかしとしてmatch_idカラムの整数値の降順にこのテーブルを選択したいです次の文は99.B、99.A、100.B、100.A、1.B、1.Aを返します。提案してください。

SQL> select * from test_1 order by match_id desc; 

答えて

2

ここでは、最後の2文字を除いて、他の文字が有効な数字になると仮定する。

それともREGEXP_SUBSTR

Select * 
from test_1 
order by TO_NUMBER(REGEXP_SUBSTR(match_id,'^[0-9]+')) desc 

を使用して、この意志はここ

0

を始めてから数字だけを取るあなたは長さのためにバインドされた(文字数)を持っている場合は、はるかに簡単な考えである入力文字列の、データを調べることなくあなたに知られています。

...order by lpad(match_id, 20, '0') desc -- assuming all the strings are length <= 20 

つまり、すべてを文字列として扱います。必要に応じて、左側にゼロを追加して、それらの長さをすべて同じにします。アルファベット順(ピリオドと文字AまたはBを含む)の順序は、数字部分の順序と同じで、AとBも降順です。 (数字だけで注文することは、BがAの前に来ることを保証しないことに注意してください)

関連する問題