日期:2014-05-16  浏览次数:20523 次

关于Oracle中文排序

?

前几天时间曾经看见有人提出的中文排序问题,当时有高手用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行