`
圣诞王子
  • 浏览: 83241 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

关于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行

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics