oracleは、フィールドの指定された順序に従ってソートします


レポート表示を行う場合、大から小へのエリアセグメントによる並べ替えなど、特定のフィールドで指定された順序で並べ替えて表示する必要があります。この要件が並べ替えに直接順序を使用する場合は、文字列は次のとおりです。辞書式順序でのソートは、必要な順序ではありません。Oracleは、この要件を達成するために2つの方法を提供しています。

最初にテストデータを準備します

drop table BR_DICT;
create table br_dict(
xl varchar2(32) not null,
mjd varchar2(32),
zb number(4,2)
);

insert into br_dict(xl, mjd, zb) values
('系列一', '≤60㎡', 2.05);
insert into br_dict(xl, mjd, zb) values
('系列一', '60-90㎡', 7.04);
insert into br_dict(xl, mjd, zb) values
('系列一', '90-120㎡', 36.92);
insert into br_dict(xl, mjd, zb) values
('系列一', '120-144㎡', 39.82);
insert into br_dict(xl, mjd, zb) values
('系列一', '144-180㎡', 9.41);
insert into br_dict(xl, mjd, zb) values
('系列一', '180-220㎡', 2.6);
insert into br_dict(xl, mjd, zb) values
('系列一', '>220㎡', 2.15);
insert into br_dict(xl, mjd, zb) values
('列一', '>220㎡', 2.15);
insert into br_dict(xl, mjd, zb) values
('一', '180-220㎡', 2.6);
insert into br_dict(xl, mjd, zb) values
('二', '144-180㎡', 9.41);

解決策1、instrによる順序で指定された順序の並べ替えを実現します

select * 
  from br_dict t
 order by instr('≤60㎡,60-90㎡,90-120㎡,120-144㎡,144-180㎡,180-220㎡,>220㎡',mjd)
;

result:
系列一	≤602.05
系列一	60-907.04
系列一	90-12036.92
系列一	120-14439.82144-1809.41
系列一	144-1809.41180-2202.6
系列一	180-2202.6
系列一	>2202.15
列一	>2202.15

注:order by instrを使用する場合、フィールド名は後ろに配置されます

オプション2:デコードによる順序付け

select * 
  from br_dict t
 order by decode
 (mjd, 
 '≤60㎡', 1,
 '60-90㎡', 2,
 '90-120㎡', 3,
 '120-144㎡', 4,
 '144-180㎡', 5,
 '180-220㎡', 6,
 '>220㎡', 7) 
;

result:
系列一	≤602.05
系列一	60-907.04
系列一	90-12036.92
系列一	120-14439.82144-1809.41
系列一	144-1809.41180-2202.6
系列一	180-2202.6
系列一	>2202.15
列一	>2202.15

注:order by instrを使用する場合、フィールド名は前に配置されます

サプリメント:拼音、ジェスチャー、部首で並べ替え

テストデータを準備する

drop table order_tb;
CREATE TABLE order_tb(
py VARCHAR2(32) NOT NULL,
bh VARCHAR2(32),
bs VARCHAR2(32)
);

insert into order_tb(py, bh, bs) values
('as', '一', '仁');
insert into order_tb(py, bh, bs) values
('ab', '二', '们');
insert into order_tb(py, bh, bs) values
('ab', '二', '们');
insert into order_tb(py, bh, bs) values
('rw', '三', '情');
insert into order_tb(py, bh, bs) values
('rw', '思', '思');
insert into order_tb(py, bh, bs) values
('bd', '四', '情');
insert into order_tb(py, bh, bs) values
('cd', '五', '据');
insert into order_tb(py, bh, bs) values
('c', '六', '次');

拼音を使用して並べ替え

デフォルトの生の順序。descキーワードを追加して降順を設定できます

select * 
  from order_tb t
 order by nlssort(py,'NLS_SORT=SCHINESE_PINYIN_M') --desc
;

result:
ab	二	们
ab	二	们
as	一	仁
as	一	仁
bc	三	怡
bc	三	怡
bd	四	情
bd	四	情
c	六	次
c	六	次
cd	五	据
cd	五	据
rw	思	思
rw	三	情

部首を使用して並べ替え

デフォルトの生の順序。descキーワードを追加して降順を設定できます

select * 
  from order_tb t
 order by nlssort(bs,'NLS_SORT=SCHINESE_RADICAL_M') --desc
;

result:
as	一	仁
as	一	仁
ab	二	们
ab	二	们
bc	三	怡
bc	三	怡
rw	思	思
rw	三	情
bd	四	情
bd	四	情
cd	五	据
cd	五	据
c	六	次
c	六	次

ストローク数で並べ替え

デフォルトの生の順序。descキーワードを追加して降順を設定できます

select * 
  from order_tb t
 order by nlssort(bh,'NLS_SORT=SCHINESE_STROKE_M') --desc
;

result:
as	一	仁
as	一	仁
ab	二	们
ab	二	们
bc	三	怡
bc	三	怡
rw	三	情
cd	五	据
cd	五	据
c	六	次
c	六	次
bd	四	情
bd	四	情
rw	思	思

おすすめ

転載: blog.csdn.net/lz6363/article/details/108814537
おすすめ