前几天时间曾经看见有人提出的中文排序问题,当时有高手用DECODE解决的。不过如果值太多,毕竟这样写比较麻烦。
这几天一直在找关于这方面的例子,其实以前也曾看见过,只是一直未曾用到,也就未加留心,下面把通用的解决方法贴出来,和大家共享之。
声明:以下所做测试,应该在oracle9i/10g以上。
oracle9i之前,中文是按照二进制编码进行排序的。
在oracle9i中新增了按照拼音、部首、笔画排序功能。可以分别通过设置NLS_SORT值来实现。
SCHINESE_RADICAL_M
按照部首(第一顺序)、笔划(第二顺序)排序。
SCHINESE_STROKE_M
按照笔划(第一顺序)、部首(第二顺序)排序。
SCHINESE_PINYIN_M
按照拼音排序,系统的默认排序方式为拼音排序。
测试如下:
--创建测试表
create table player
(id number(*,0),
name varchar2(32)
);
--插入测试数据
insert into PLAYER (ID, NAME)
values (1, '卡卡');
insert into PLAYER (ID, NAME)
values (2, '罗纳尔迪尼奥');
insert into PLAYER (ID, NAME)
values (3, '马尔递尼');
insert into PLAYER (ID, NAME)
values (4, '因扎吉');
insert into PLAYER (ID, NAME)
values (5, '舍甫琴柯');
insert into PLAYER (ID, NAME)
values (6, '西多夫');
insert into PLAYER (ID, NAME)
values (7, '帕托');
insert into PLAYER (ID, NAME)
values (8, '皮尔洛');
insert into PLAYER (ID, NAME)
values (9, '内斯塔');
commit;
--按照笔划排序
SQL> select * from player order by
2 nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
ID NAME
---------- --------------------------------
3 马尔递尼
9 内斯塔
1 卡卡
8 皮尔洛
4 因扎吉
6 西多夫
7 帕托
2 罗纳尔迪尼奥
5 舍甫琴柯
已选择9行。
--按照部首排序
SQL> select * from player order by
2 nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');
ID NAME
---------- --------------------------------
9 内斯塔
1 卡卡
4 因扎吉
7 帕托
8 皮尔洛
2 罗纳尔迪尼奥
5 舍甫琴柯
6 西多夫
3 马尔递尼
已选择9行。
--按照拼音排序,此为系统的默认排序方式
SQL> select * from player order by
2 nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');
ID NAME
---------- --------------------------------
1 卡卡
2 罗纳尔迪尼奥
3 马尔递尼
9 内斯塔
7 帕托
8 皮尔洛
5 舍甫琴柯
6 西多夫
4 因扎吉
已选择9行。
--默认排序,检验
SQL> select * from player order by name;
ID NAME
---------- --------------------------------
1 卡卡
2 罗纳尔迪尼奥
3 马尔递尼
9 内斯塔
7 帕托
8 皮尔洛
5 舍甫琴柯
6 西多夫
4 因扎吉
已选择9行