在oracle里可以有方法得到汉字的笔画数吗?我现在的目的是要实现按笔画数查找数据库,各位高手支招啊!!

解决方案 »

  1.   

    表名为 dept,其中name字段是中文//按照笔划排序
    select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
    //按照部首排序
    select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');
    //按照拼音排序,此为系统的默认排序方式
    select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');
      

  2.   

    //按照笔划排序
    select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
    //按照部首排序
    select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');
    //按照拼音排序,此为系统的默认排序方式
    select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');
      

  3.   

    厉害,是比较,还是排序,排序,如果你的数据库的字符集支持的话,是可以做到的,如果是比较的话,你需要写自己的function叻。如果可以最好改数据库设计,加入字段,记录笔画。这才是数据库应该做的。
      

  4.   

    搞个表,把每个汉字的笔画数输进去,然后要用的时候select一下就好了
    不过前期过程痛苦哈哈
      

  5.   


    如何修改系统默认规则:
    alter session set nls_sort='schinese_pinyin_m';
    select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');Oracle9i之前,中文是按照二进制编码进行排序的。
    在oracle9i中新增了按照拼音、部首、笔画排序功能。设置NLS_SORT值
    SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序
    SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序
    SCHINESE_PINYIN_M 按照拼音排序,系统的默认排序方式为拼音排序举例如下:
    表名为 dept ,其中name字段是中文,下面分别实现按照单位名称的笔划、部首和拼音排序。
    1: //按照笔划排序
    2: select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
    3: //按照部首排序
    4: select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');
    5: //按照拼音排序,此为系统的默认排序方式
    6: select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M'); 注意,该SQL指令并非标准指令,在SQLServer下面的实现方式并不相同。
      

  6.   


    CREATE TABLE TB_STROKE(WORD VARCHAR2(2),STROKE_COUNT NUMBER(2,0));INSERT INTO TB_STROKE(WORD,STROKE_COUNT)
    SELECT '一',1 FROM DUAL
    UNION ALL 
    SELECT '二',2 FROM DUAL
    UNION ALL 
    SELECT '口',3 FROM DUAL
    UNION ALL 
    SELECT '木',4 FROM DUAL
    UNION ALL 
    SELECT '禾',5 FROM DUAL
    UNION ALL 
    SELECT '众',6 FROM DUAL
    UNION ALL 
    SELECT '沐',7 FROM DUAL
    UNION ALL 
    SELECT '和',8 FROM DUAL
    UNION ALL 
    SELECT '骨',9 FROM DUAL
    UNION ALL 
    SELECT '徐',10 FROM DUAL
    UNION ALL 
    SELECT '曹',11 FROM DUAL
    UNION ALL 
    SELECT '彭',12 FROM DUAL;CREATE OR REPLACE FUNCTION GET_STROKE_COUNT(F_WORD IN VARCHAR2 )
    RETURN INT
    AS
    I INT:=0;
    BEGIN
        SELECT MAX(STROKE_COUNT)+1 INTO I FROM TB_STROKE where nlssort(WORD,'NLS_SORT=SCHINESE_STROKE_M')<nlssort(F_WORD,'NLS_SORT=SCHINESE_STROKE_M');    
        RETURN I;
    END GET_STROKE_COUNT;--测试
    SELECT GET_STROKE_COUNT('甲') FROM DUAL;
    --显示5
    SELECT GET_STROKE_COUNT('骨') FROM DUAL;
    --显示9
    SELECT GET_STROKE_COUNT('文') FROM DUAL;
    --显示4
    --SQL内直接调用
    SELECT MAX(STROKE_COUNT)+1 FROM TB_STROKE where nlssort(WORD,'NLS_SORT=SCHINESE_STROKE_M')<nlssort('甲','NLS_SORT=SCHINESE_STROKE_M');不得不说的是,以上存在问题的一个方面是TB_STROKE内插入的记录没有代表性,因为SELECT nlssort('二','NLS_SORT=SCHINESE_STROKE_M') FROM DUAL
    UNION ALL
    SELECT nlssort('丁','NLS_SORT=SCHINESE_STROKE_M') FROM DUAL
    UNION ALL
    SELECT nlssort('人','NLS_SORT=SCHINESE_STROKE_M') FROM DUAL显示的结果为
    NLSSORT('二','NLS_SORT=SCHINES 
    3B3E0000010001 
    3B360000010001 
    3B4E0000010001 
    所以必须保证nlssort([],'NLS_SORT=SCHINESE_STROKE_M')同等笔画中最小.
    下面会有更精彩的回复.