日期:2014-05-16 浏览次数:20523 次
?
前几天时间曾经看见有人提出的中文排序问题,当时有高手用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行