목차
보고서 표시를 수행 할 때 특정 필드에 지정된 순서에 따라 정렬하고 표시해야하는 이러한 요구 사항이 발생합니다 (예 : 영역 세그먼트에 따라 큰 것에서 작은 것까지 정렬).이 요구 사항이 정렬을 위해 order by를 직접 사용하는 경우, 문자열은 사전 식 순서로 정렬하는 것이 원하는 순서가 아닙니다. Oracle은이 요구 사항을 충족하기 위해 두 가지 방법을 제공합니다.
먼저 테스트 데이터 준비
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:
系列一 ≤60㎡ 2.05
系列一 60-90㎡ 7.04
系列一 90-120㎡ 36.92
系列一 120-144㎡ 39.82
二 144-180㎡ 9.41
系列一 144-180㎡ 9.41
一 180-220㎡ 2.6
系列一 180-220㎡ 2.6
系列一 >220㎡ 2.15
列一 >220㎡ 2.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:
系列一 ≤60㎡ 2.05
系列一 60-90㎡ 7.04
系列一 90-120㎡ 36.92
系列一 120-144㎡ 39.82
二 144-180㎡ 9.41
系列一 144-180㎡ 9.41
一 180-220㎡ 2.6
系列一 180-220㎡ 2.6
系列一 >220㎡ 2.15
列一 >220㎡ 2.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 思 思